﻿Imports Microsoft.DirectX.Direct3D
Imports Microsoft.DirectX
Imports Commander_Wars.Spieletools
Public Class Objektverwalter
#Region "Variablen"
    Enum ABC
        A
        B
        C
        D
        E
        F
        G
        H
        I
        J
        K
        L
        M
        N
        O
        P
        Q
        R
        S
        T
        U
        V
        W
        X
        Y
        Z
    End Enum
    Private Shared Frames As Integer
    Public Shared AlreadySaved As Boolean = False
    Public Shared MoveActionDone As Boolean = False
    Public Shared ToolTips As ToolTip
    Public Shared Property FrameMarkierteFelder() As Integer
        Get
            Return Frames
        End Get
        Set(ByVal value As Integer)
            Frames += 1
            If Frames > 1 Then
                Frames = 0
            End If
        End Set
    End Property
#Region "Texturen"
    ''' <summary>
    ''' Texturvom Bild
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared texturHintergrungBild As Texture
    ''' <summary>
    ''' Texturvom Bild
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared texturVordergrundBild As Texture
    Public Shared LandschaftenBilder() As ObjektLandschaftsTextur = {}
    Public Shared Pfeile() As Texture = {}
    Public Shared Symbole() As Texture = {}
    Public Shared Symbolfunktion() As String = {}

#Region "KO'S"
    Public Const KOArrayLenght As Integer = 11
    Private Shared KOS1() As KO = {}
    Private Shared KOS2() As KO = {}
    Private Shared KOS3() As KO = {}
    Private Shared KOS4() As KO = {}
    Private Shared KOS5() As KO = {}
    Private Shared KOS6() As KO = {}
    Private Shared KOS7() As KO = {}
    Private Shared KOS8() As KO = {}
    Private Shared KOS9() As KO = {}
    Public Shared NPCS As New List(Of NPC)

    Public Shared Function GetKO(ByVal KOID As Integer) As KO
        If KOID >= KOArrayLenght Then
            If KOID >= KOArrayLenght * 2 Then
                If KOID >= KOArrayLenght * 3 Then
                    If KOID >= KOArrayLenght * 4 Then
                        If KOID >= KOArrayLenght * 5 Then
                            If KOID >= KOArrayLenght * 6 Then
                                If KOID >= KOArrayLenght * 7 Then
                                    If KOID >= KOArrayLenght * 8 Then
                                        Return KOS9(KOID - KOArrayLenght * 8)
                                    Else
                                        Return KOS8(KOID - KOArrayLenght * 7)
                                    End If
                                Else
                                    Return KOS7(KOID - KOArrayLenght * 6)
                                End If
                            Else
                                Return KOS6(KOID - KOArrayLenght * 5)
                            End If
                        Else
                            Return KOS5(KOID - KOArrayLenght * 4)
                        End If
                    Else
                        Return KOS4(KOID - KOArrayLenght * 3)
                    End If
                Else
                    Return KOS3(KOID - KOArrayLenght * 2)
                End If
            Else
                Return KOS2(KOID - KOArrayLenght)
            End If
        Else
            Return KOS1(KOID)
        End If
    End Function
    Public Shared Function GetKO(ByVal KOID As String) As KO
        For I = 0 To KOS1.Length - 1
            If KOS1(I).KOID.ToUpper = KOID.ToUpper Then
                Return KOS1(I)
            End If
        Next
        For I = 0 To KOS2.Length - 1
            If KOS2(I).KOID.ToUpper = KOID.ToUpper Then
                Return KOS2(I)
            End If
        Next
        For I = 0 To KOS3.Length - 1
            If KOS3(I).KOID.ToUpper = KOID.ToUpper Then
                Return KOS3(I)
            End If
        Next
        For I = 0 To KOS4.Length - 1
            If KOS4(I).KOID.ToUpper = KOID.ToUpper Then
                Return KOS4(I)
            End If
        Next
        For I = 0 To KOS5.Length - 1
            If KOS5(I).KOID.ToUpper = KOID.ToUpper Then
                Return KOS5(I)
            End If
        Next
        For I = 0 To KOS6.Length - 1
            If KOS6(I).KOID.ToUpper = KOID.ToUpper Then
                Return KOS6(I)
            End If
        Next
        For I = 0 To KOS7.Length - 1
            If KOS7(I).KOID.ToUpper = KOID.ToUpper Then
                Return KOS7(I)
            End If
        Next
        For I = 0 To KOS8.Length - 1
            If KOS8(I).KOID.ToUpper = KOID.ToUpper Then
                Return KOS8(I)
            End If
        Next
        For I = 0 To KOS9.Length - 1
            If KOS9(I).KOID.ToUpper = KOID.ToUpper Then
                Return KOS9(I)
            End If
        Next
        Return KOS1(0)
    End Function
    Public Shared Function GetKOID(ByVal KOID As String) As Integer
        For I = 0 To KOS1.Length - 1
            If KOS1(I).KOID.ToUpper = KOID.ToUpper Then
                Return I
            End If
        Next
        For I = 0 To KOS2.Length - 1
            If KOS2(I).KOID.ToUpper = KOID.ToUpper Then
                Return I + KOArrayLenght
            End If
        Next
        For I = 0 To KOS3.Length - 1
            If KOS3(I).KOID.ToUpper = KOID.ToUpper Then
                Return I + KOArrayLenght * 2
            End If
        Next
        For I = 0 To KOS4.Length - 1
            If KOS4(I).KOID.ToUpper = KOID.ToUpper Then
                Return I + KOArrayLenght * 3
            End If
        Next
        For I = 0 To KOS5.Length - 1
            If KOS5(I).KOID.ToUpper = KOID.ToUpper Then
                Return I + KOArrayLenght * 4
            End If
        Next
        For I = 0 To KOS6.Length - 1
            If KOS6(I).KOID.ToUpper = KOID.ToUpper Then
                Return I + KOArrayLenght * 5
            End If
        Next
        For I = 0 To KOS7.Length - 1
            If KOS7(I).KOID.ToUpper = KOID.ToUpper Then
                Return I + KOArrayLenght * 6
            End If
        Next
        For I = 0 To KOS8.Length - 1
            If KOS8(I).KOID.ToUpper = KOID.ToUpper Then
                Return I + KOArrayLenght * 7
            End If
        Next
        For I = 0 To KOS9.Length - 1
            If KOS9(I).KOID.ToUpper = KOID.ToUpper Then
                Return I + KOArrayLenght * 8
            End If
        Next
        Return 0
    End Function

    Public Shared Function GetKOLength() As Integer
        Dim Anzahl As Integer = KOS1.Length + KOS2.Length + KOS3.Length + KOS4.Length + KOS5.Length + KOS6.Length + KOS7.Length + KOS8.Length + KOS9.Length

        Return Anzahl
    End Function
    Public Shared CustomKOS() As KOCustom = {}
    Public Shared ABCBild As Texture
    Public Shared TagzuTagAnzeige() As Texture = {}
    Public Shared TagzuTagArmee() As String = {}
    Structure KO
        Public Sub New(ByVal Textur As String, ByVal ID As String, ByVal neuArmy As String, ByVal Beschreibunge As ObjektKOBeschreibung)
            KOIDE = ID
            ARMY = neuArmy
            Beschreibung = Beschreibunge

            Dim T As String() = Textur.Split(":")
            Dim PIC As Bitmap = Nothing
            Dim ColorTable As Bitmap = Nothing
            'Loading CO-Sheet and Colortable
            If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "CO's\CO\" + ARMY + "\" + T(0) + ".png") Then
                PIC = Image.FromFile(DataSettings.Resourcenpfad + "CO's\CO\" + ARMY + "\" + T(0) + ".png")
                ColorTable = GetColorTable(T(0), ARMY)
            ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "CO's\CO\" + ARMY + "\" + KOIDE + ".png") Then
                PIC = Image.FromFile(DataSettings.Resourcenpfad + "CO's\CO\" + ARMY + "\" + KOIDE + ".png")
                ColorTable = GetColorTable(KOIDE, ARMY)
            ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "CO's\CO\" + ARMY + "\" + KOIDE + " Nrm.png") Then
                PIC = Image.FromFile(DataSettings.Resourcenpfad + "CO's\CO\" + ARMY + "\" + KOIDE + " Nrm.png")
                ColorTable = GetColorTable(KOIDE + " Nrm", ARMY)
            ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "CO's\CO\" + ARMY + "\" + KOIDE + "Nrm.png") Then
                PIC = Image.FromFile(DataSettings.Resourcenpfad + "CO's\CO\" + ARMY + "\" + KOIDE + "Nrm.png")
                ColorTable = GetColorTable(KOIDE + "Nrm", ARMY)
            ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "CO's\CO\" + ARMY + "\" + KOIDE + " AW1 Alt.png") Then
                PIC = Image.FromFile(DataSettings.Resourcenpfad + "CO's\CO\" + ARMY + "\" + KOIDE + " AW1 Alt.png")
                ColorTable = GetColorTable(KOIDE + " AW1 Alt", ARMY)
            ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "CO's\CO\" + ARMY + "\" + KOIDE + " AW2 Alt.png") Then
                PIC = Image.FromFile(DataSettings.Resourcenpfad + "CO's\CO\" + ARMY + "\" + KOIDE + " AW2 Alt.png")
                ColorTable = GetColorTable(KOIDE + " AW2 Alt", ARMY)
            End If
            'Changing the CO-Sheet
            If T.Length > 1 And ColorTable IsNot Nothing Then
                If IsNumeric(T(1)) Then
                    Dim Line As Integer = T(1)
                    If Line < ColorTable.Height Then
                        'This 3 Lines recolor the CO-Sheet
                        For I = 0 To ColorTable.Width - 1
                            PIC = Grafikengine.Pixelneueinfaerben(PIC, ColorTable.GetPixel(I, 0), ColorTable.GetPixel(I, Line))
                        Next
                    End If
                End If
            End If
            'Load and Dispose Stuff.
            If ColorTable IsNot Nothing Then
                ColorTable.Dispose()
            End If
            If PIC IsNot Nothing Then
                KOTexture = Grafikengine.LoadTexture(PIC)
                PIC.Dispose()
            End If
        End Sub
        Public Sub New(ByVal Textur As Texture, ByVal ID As String, ByVal neuArmy As String, ByVal Beschreibunge As ObjektKOBeschreibung)
            KOTexture = Textur
            KOIDE = ID
            ARMY = neuArmy
            Beschreibung = Beschreibunge
        End Sub
        Dim KOTexture As Direct3D.Texture
        Private KOIDE As String
        Public ReadOnly Property KOID() As String
            Get
                Return KOIDE
            End Get
        End Property
        Private ARMY As String
        Public ReadOnly Property Armee() As String
            Get
                Return ARMY
            End Get
        End Property
        Private Beschreibung As ObjektKOBeschreibung
        Public ReadOnly Property KOBeschreibung() As ObjektKOBeschreibung
            Get
                Return Beschreibung
            End Get
        End Property
        Public Sub Reset()
            If KOTexture IsNot Nothing Then
                KOTexture.Dispose()
                KOTexture = Nothing
                Grafikengine.Grafikkarte.EvictManagedResources()
            End If
        End Sub
        Public Shared Function GetColorTable(ByVal Sheet As String, ByVal Army As String, Optional ByVal KOIDE As String = "", Optional ByVal COLoad As Boolean = False) As Bitmap
            Dim ColorTable As Bitmap = Nothing
            If COLoad Then
                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "CO's\CO\" + Army + "\" + Sheet + ".tbl") Then
                    ColorTable = Image.FromFile(DataSettings.Resourcenpfad + "CO's\CO\" + Army + "\" + Sheet + ".tbl")
                ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "CO's\CO\" + Army + "\" + KOIDE + ".tbl") Then
                    ColorTable = Image.FromFile(DataSettings.Resourcenpfad + "CO's\CO\" + Army + "\" + KOIDE + ".tbl")
                ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "CO's\CO\" + Army + "\" + KOIDE + " AW2 Alt.tbl") Then
                    ColorTable = Image.FromFile(DataSettings.Resourcenpfad + "CO's\CO\" + Army + "\" + KOIDE + " AW2 Alt.tbl")
                ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "CO's\CO\" + Army + "\" + KOIDE + " AW1 Alt.tbl") Then
                    ColorTable = Image.FromFile(DataSettings.Resourcenpfad + "CO's\CO\" + Army + "\" + KOIDE + " AW1 Alt.tbl")
                ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "CO's\CO\" + Army + "\" + KOIDE + " Nrm.tbl") Then
                    ColorTable = Image.FromFile(DataSettings.Resourcenpfad + "CO's\CO\" + Army + "\" + KOIDE + " Nrm.tbl")
                ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "CO's\CO\" + Army + "\" + KOIDE + " Nrm.tbl") Then
                    ColorTable = Image.FromFile(DataSettings.Resourcenpfad + "CO's\CO\" + Army + "\" + KOIDE + "Nrm.tbl")
                End If
            ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "CO's\CO\" + Army + "\" + Sheet + ".tbl") Then
                ColorTable = Image.FromFile(DataSettings.Resourcenpfad + "CO's\CO\" + Army + "\" + Sheet + ".tbl")
            End If
            Return ColorTable
        End Function
#Region "Draw CO"
        Public Sub KOGesichtsausdruckMalen(ByVal Emotion As Integer, ByVal X As Integer, ByVal Y As Integer)
            If KOTexture IsNot Nothing Then
                Dim sngRotation As Double = 0
                Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
                Grafikengine.ptfRotCenter = Nothing
                Grafikengine.szfScale = New Size(48, 48)
                With Grafikengine.recBild
                    .X = 48 * Emotion
                    .Y = 352
                    .Width = 48
                    .Height = 48
                End With
                Grafikengine.ptfPosition = New Drawing.Point(X, Y)
                Grafikengine.Sprite.Draw2D(KOTexture, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            End If
        End Sub

        Public Sub KOMalen(ByVal X As Integer, ByVal Y As Integer)
            If KOTexture IsNot Nothing Then
                Dim sngRotation As Double = 0
                Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
                Grafikengine.ptfRotCenter = Nothing
                Grafikengine.szfScale = Nothing
                With Grafikengine.recBild
                    .X = 0
                    .Y = 0
                    .Width = 208
                    .Height = 352
                End With
                Grafikengine.ptfPosition = New Drawing.Point(X, Y)
                Grafikengine.Sprite.Draw2D(KOTexture, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            End If
        End Sub
        Public Shared Sub KOMalen(ByVal X As Integer, ByVal Y As Integer, ByVal KOTextur As Texture)
            If KOTextur IsNot Nothing Then
                Dim sngRotation As Double = 0
                Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
                Grafikengine.ptfRotCenter = Nothing
                Grafikengine.szfScale = Nothing
                With Grafikengine.recBild
                    .X = 0
                    .Y = 0
                    .Width = 208
                    .Height = 352
                End With
                Grafikengine.ptfPosition = New Drawing.Point(X, Y)
                Grafikengine.Sprite.Draw2D(KOTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            End If
        End Sub
        Public Sub KOGesichtsausdruckMalen(ByVal Emotion As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal StartX As Integer, ByVal Hoehe As Integer)
            Dim sngRotation As Double = 0
            Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
            Grafikengine.ptfRotCenter = Nothing
            Grafikengine.szfScale = Nothing
            With Grafikengine.recBild
                .X = 48 * Emotion
                .Y = 352 + StartX
                .Width = 48
                .Height = Hoehe
            End With
            Grafikengine.ptfPosition = New Drawing.Point(X, Y)
            Grafikengine.Sprite.Draw2D(KOTexture, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        End Sub
        Public Sub MiniGesichtMalen(ByVal X As Integer, ByVal Y As Integer, ByVal Links As Boolean)
            Dim sngRotation As Double = 0
            Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
            Grafikengine.ptfRotCenter = Nothing
            Grafikengine.szfScale = Nothing
            With Grafikengine.recBild
                .X = 144
                .Y = 352
                .Width = 32
                .Height = 12
            End With
            If Links = True Then
                Grafikengine.recBild.Y += 12
            End If
            Grafikengine.ptfPosition = New Drawing.Point(X, Y)
            Grafikengine.Sprite.Draw2D(KOTexture, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        End Sub
        Public Shared Sub KOGesichtsausdruckMalen(ByVal Emotion As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal Tex As Texture)
            Dim sngRotation As Double = 0
            Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
            Grafikengine.ptfRotCenter = Nothing
            Grafikengine.szfScale = New Size(48, 48)
            With Grafikengine.recBild
                .X = 48 * Emotion
                .Y = 352
                .Width = 48
                .Height = 48
            End With
            Grafikengine.ptfPosition = New Drawing.Point(X, Y)
            Grafikengine.Sprite.Draw2D(Tex, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        End Sub
#End Region
    End Structure
    Structure NPC
        Public Sub New(ByVal Textur As String, ByVal ID As String)
            KOIDE = ID
            Dim T As String() = Textur.Split(":")
            Dim PIC As Bitmap = Nothing
            'Loading CO-Sheet and Colortable
            If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "CO's\CO\NPC\" + T(0) + ".png") Then
                PIC = Image.FromFile(DataSettings.Resourcenpfad + "CO's\CO\NPC\" + T(0) + ".png")
            ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "CO's\CO\NPC\" + KOIDE + ".png") Then
                PIC = Image.FromFile(DataSettings.Resourcenpfad + "CO's\CO\NPC\" + KOIDE + ".png")
            ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "CO's\CO\NPC\" + KOIDE + " Nrm.png") Then
                PIC = Image.FromFile(DataSettings.Resourcenpfad + "CO's\CO\NPC\" + KOIDE + " Nrm.png")
            ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "CO's\CO\NPC\" + KOIDE + "Nrm.png") Then
                PIC = Image.FromFile(DataSettings.Resourcenpfad + "CO's\CO\NPC\" + KOIDE + "Nrm.png")
            ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "CO's\CO\NPC\" + KOIDE + " AW1 Alt.png") Then
                PIC = Image.FromFile(DataSettings.Resourcenpfad + "CO's\CO\NPC\" + KOIDE + " AW1 Alt.png")
            ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "CO's\CO\NPC\" + KOIDE + " AW2 Alt.png") Then
                PIC = Image.FromFile(DataSettings.Resourcenpfad + "CO's\CO\NPC\" + KOIDE + " AW2 Alt.png")
            End If
            If PIC IsNot Nothing Then
                KOTexture = Grafikengine.LoadTexture(PIC)
                PIC.Dispose()
            End If
        End Sub
        Public Sub New(ByVal Textur As Texture, ByVal ID As String)
            KOTexture = Textur
            KOIDE = ID
        End Sub
        Dim KOTexture As Direct3D.Texture
        Private KOIDE As String
        Public ReadOnly Property KOID() As String
            Get
                Return KOIDE
            End Get
        End Property
        Public Sub KOGesichtsausdruckMalen(ByVal Emotion As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal StartX As Integer, ByVal Hoehe As Integer)
            Dim sngRotation As Double = 0
            Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
            Grafikengine.ptfRotCenter = Nothing
            Grafikengine.szfScale = Nothing
            With Grafikengine.recBild
                .X = 48 * Emotion
                .Y = StartX
                .Width = 48
                .Height = Hoehe
            End With
            Grafikengine.ptfPosition = New Drawing.Point(X, Y)
            Grafikengine.Sprite.Draw2D(KOTexture, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        End Sub
        Public Sub KOGesichtsausdruckMalen(ByVal Emotion As Integer, ByVal X As Integer, ByVal Y As Integer)
            If KOTexture IsNot Nothing Then
                Dim sngRotation As Double = 0
                Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
                Grafikengine.ptfRotCenter = Nothing
                Grafikengine.szfScale = New Size(48, 48)
                With Grafikengine.recBild
                    .X = 48 * Emotion
                    .Y = 0
                    .Width = 48
                    .Height = 48
                End With
                Grafikengine.ptfPosition = New Drawing.Point(X, Y)
                Grafikengine.Sprite.Draw2D(KOTexture, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            End If
        End Sub
    End Structure
    Public Shared Sub KOTexturenLaden()
        Dim NeueKos() As KO = {}
        For Each KO In KOS1
            KO.Reset()
        Next
        Array.Resize(KOS1, 0)
        For Each KO In KOS2
            KO.Reset()
        Next
        Array.Resize(KOS2, 0)
        For Each KO In KOS3
            KO.Reset()
        Next
        Array.Resize(KOS3, 0)
        For Each KO In KOS4
            KO.Reset()
        Next
        Array.Resize(KOS4, 0)
        For Each KO In KOS5
            KO.Reset()
        Next
        Array.Resize(KOS5, 0)
        For Each KO In KOS6
            KO.Reset()
        Next
        Array.Resize(KOS6, 0)
        For Each KO In KOS7
            KO.Reset()
        Next
        Array.Resize(KOS7, 0)
        For Each KO In KOS8
            KO.Reset()
        Next
        Array.Resize(KOS8, 0)
        For Each KO In KOS9
            KO.Reset()
        Next
        Array.Resize(KOS9, 0)

        ObjektLadeklasse.KOLaden(NeueKos)
        For I = 0 To TagzuTagAnzeige.Length - 1
            If TagzuTagAnzeige(I) IsNot Nothing Then
                TagzuTagAnzeige(I).Dispose()
                TagzuTagAnzeige(I) = Nothing
            End If
        Next
        Grafikengine.Grafikkarte.EvictManagedResources()
        Array.Resize(TagzuTagAnzeige, 0)
        Array.Resize(TagzuTagArmee, 0)

        KOeinerArmeeHinzufuegen(NeueKos, Armeen.OS.ToString)
        KOeinerArmeeHinzufuegen(NeueKos, Armeen.BM.ToString)
        KOeinerArmeeHinzufuegen(NeueKos, Armeen.GE.ToString)
        KOeinerArmeeHinzufuegen(NeueKos, Armeen.YC.ToString)
        KOeinerArmeeHinzufuegen(NeueKos, Armeen.BH.ToString)
        KOeinerArmeeHinzufuegen(NeueKos, Armeen.BG.ToString)
        KOeinerArmeeHinzufuegen(NeueKos, Armeen.ML.ToString)
        KOeinerArmeeHinzufuegen(NeueKos, Armeen.AC.ToString)
        KOeinerArmeeHinzufuegen(NeueKos, Armeen.BT.ToString)
        KOeinerArmeeHinzufuegen(NeueKos, Armeen.GS.ToString)
        KOeinerArmeeHinzufuegen(NeueKos, Armeen.PF.ToString)
        KOeinerArmeeHinzufuegen(NeueKos, Armeen.TI.ToString)
        KOeinerArmeeHinzufuegen(NeueKos, Armeen.DM.ToString)
        ObjektPfeil.Reset()
        For I = 0 To NeueKos.Length - 1
            For I2 = 0 To GetKOLength() - 1
                If NeueKos(I).Armee = GetKO(I2).Armee Then
                    Exit For
                ElseIf I2 = GetKOLength() - 1 Then
                    KOeinerArmeeHinzufuegen(NeueKos, NeueKos(I).Armee)
                End If
            Next
        Next

        'Dim S As Sprachen = DataSettings.Sprache
        'Using W As New System.IO.StreamWriter("rammierung\Commander Wars\Programm\Commander Wars\Output\KOS+" + S.ToString + ".txt")
        '    For i = 0 To KOS.Length - 1
        '        W.WriteLine(KOS(i).KOID + "=" + KOS(i).KOBeschreibung.Name)
        '    Next
        'End Using

    End Sub
    Public Shared Sub KOeinerArmeeHinzufuegen(ByVal NeueKOS() As KO, ByVal Armee As String)
        Array.Resize(TagzuTagAnzeige, TagzuTagAnzeige.Length + 1)
        If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Objects\Tag" + Armee + ".png") Then
            TagzuTagAnzeige(TagzuTagAnzeige.Length - 1) = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Objects\Tag" + Armee + ".png")
        Else
            TagzuTagAnzeige(TagzuTagAnzeige.Length - 1) = TagzuTagAnzeige(0)
        End If
        Array.Resize(TagzuTagArmee, TagzuTagArmee.Length + 1)
        TagzuTagArmee(TagzuTagArmee.Length - 1) = Armee
        For I = 0 To NeueKOS.Length - 1
            If NeueKOS(I).Armee = Armee Then
                AddKO(NeueKOS(I))
            End If
        Next
    End Sub
    Public Shared Sub AddKOS(ByVal NewKO() As KO)
        For I = 0 To NewKO.Length - 1
            AddKO(NewKO(I))
        Next
    End Sub
    Public Shared Sub AddKO(ByVal NewKO As KO)
        If KOS1.Length < KOArrayLenght Then
            Array.Resize(KOS1, KOS1.Length + 1)
            KOS1(KOS1.Length - 1) = NewKO
        ElseIf KOS2.Length < KOArrayLenght Then
            Array.Resize(KOS2, KOS2.Length + 1)
            KOS2(KOS2.Length - 1) = NewKO
        ElseIf KOS3.Length < KOArrayLenght Then
            Array.Resize(KOS3, KOS3.Length + 1)
            KOS3(KOS3.Length - 1) = NewKO
        ElseIf KOS4.Length < KOArrayLenght Then
            Array.Resize(KOS4, KOS4.Length + 1)
            KOS4(KOS4.Length - 1) = NewKO
        ElseIf KOS5.Length < KOArrayLenght Then
            Array.Resize(KOS5, KOS5.Length + 1)
            KOS5(KOS5.Length - 1) = NewKO
        ElseIf KOS6.Length < KOArrayLenght Then
            Array.Resize(KOS6, KOS6.Length + 1)
            KOS6(KOS6.Length - 1) = NewKO
        ElseIf KOS7.Length < KOArrayLenght Then
            Array.Resize(KOS7, KOS7.Length + 1)
            KOS7(KOS7.Length - 1) = NewKO
        ElseIf KOS8.Length < KOArrayLenght Then
            Array.Resize(KOS8, KOS8.Length + 1)
            KOS8(KOS8.Length - 1) = NewKO
        Else
            Array.Resize(KOS9, KOS9.Length + 1)
            KOS9(KOS9.Length - 1) = NewKO
        End If
    End Sub
    Public Shared Sub SetKOTexture(ByVal Textur As Texture, ByVal KOID As Integer)
        If KOID >= KOArrayLenght Then
            If KOID >= KOArrayLenght * 2 Then
                If KOID >= KOArrayLenght * 3 Then
                    If KOID >= KOArrayLenght * 4 Then
                        If KOID >= KOArrayLenght * 5 Then
                            If KOID >= KOArrayLenght * 6 Then
                                If KOID >= KOArrayLenght * 7 Then
                                    If KOID >= KOArrayLenght * 8 Then
                                        KOS9(KOID - KOArrayLenght * 8).KOTexture = Textur
                                    Else
                                        KOS8(KOID - KOArrayLenght * 7).KOTexture = Textur
                                    End If
                                Else
                                    KOS7(KOID - KOArrayLenght * 6).KOTexture = Textur
                                End If
                            Else
                                KOS6(KOID - KOArrayLenght * 5).KOTexture = Textur
                            End If
                        Else
                            KOS5(KOID - KOArrayLenght * 4).KOTexture = Textur
                        End If
                    Else
                        KOS4(KOID - KOArrayLenght * 3).KOTexture = Textur
                    End If
                Else
                    KOS3(KOID - KOArrayLenght * 2).KOTexture = Textur
                End If
            Else
                KOS2(KOID - KOArrayLenght).KOTexture = Textur
            End If
        Else
            KOS1(KOID).KOTexture = Textur
        End If
    End Sub
    Public Shared Sub DeleteKOS(ByVal NewLength As Integer)
        If NewLength < KOArrayLenght Then
            Array.Resize(KOS1, NewLength)
            Array.Resize(KOS2, 0)
            Array.Resize(KOS3, 0)
            Array.Resize(KOS4, 0)
            Array.Resize(KOS5, 0)
            Array.Resize(KOS6, 0)
            Array.Resize(KOS7, 0)
            Array.Resize(KOS8, 0)
            Array.Resize(KOS9, 0)
        ElseIf NewLength < KOArrayLenght * 2 Then
            Array.Resize(KOS2, NewLength - KOArrayLenght)
            Array.Resize(KOS3, 0)
            Array.Resize(KOS4, 0)
            Array.Resize(KOS5, 0)
            Array.Resize(KOS6, 0)
            Array.Resize(KOS7, 0)
            Array.Resize(KOS8, 0)
            Array.Resize(KOS9, 0)
        ElseIf NewLength < KOArrayLenght * 3 Then
            Array.Resize(KOS3, NewLength - KOArrayLenght * 2)
            Array.Resize(KOS4, 0)
            Array.Resize(KOS5, 0)
            Array.Resize(KOS6, 0)
            Array.Resize(KOS7, 0)
            Array.Resize(KOS8, 0)
            Array.Resize(KOS9, 0)
        ElseIf NewLength < KOArrayLenght * 4 Then
            Array.Resize(KOS4, NewLength - KOArrayLenght * 3)
            Array.Resize(KOS5, 0)
            Array.Resize(KOS6, 0)
            Array.Resize(KOS7, 0)
            Array.Resize(KOS8, 0)
            Array.Resize(KOS9, 0)
        ElseIf NewLength < KOArrayLenght * 5 Then
            Array.Resize(KOS5, NewLength - KOArrayLenght * 4)
            Array.Resize(KOS6, 0)
            Array.Resize(KOS7, 0)
            Array.Resize(KOS8, 0)
            Array.Resize(KOS9, 0)
        ElseIf NewLength < KOArrayLenght * 6 Then
            Array.Resize(KOS6, NewLength - KOArrayLenght * 5)
            Array.Resize(KOS7, 0)
            Array.Resize(KOS8, 0)
            Array.Resize(KOS9, 0)
        ElseIf NewLength < KOArrayLenght * 7 Then
            Array.Resize(KOS7, NewLength - KOArrayLenght * 6)
            Array.Resize(KOS8, 0)
            Array.Resize(KOS9, 0)
        ElseIf NewLength < KOArrayLenght * 7 Then
            Array.Resize(KOS8, NewLength - KOArrayLenght * 7)
            Array.Resize(KOS9, 0)
        ElseIf NewLength - KOArrayLenght * 8 >= 0 Then
            Array.Resize(KOS9, NewLength - KOArrayLenght * 8)
        End If
    End Sub

#End Region
#Region "Einheiten und Gebaeude Texturen und so"
#Region "Einheiten"
    ''' <summary>
    ''' KampfanimationsTexturen der Einheiten werden hier gespeichert!
    ''' </summary>
    ''' <remarks></remarks>
    Structure Kampfanimation
        Implements ICloneable
        Public EinheitenID As String
        Public Class Textur
            Public Maintextur As Texture
            Public MainMask As Texture
            Public Name As Animations
            Public Frames As Integer = 0
            Enum Animations
                Walk
                Weapon1_Normal
                Weapon2_Normal
            End Enum
        End Class
        Public Texturs As List(Of Textur)
        Public MovementFrames As Integer
        Public Stoppingframes As Integer
        Public Bildgroesse As Size
        Public Truppenzahl As Integer
        Public EinzelUnitPosition As Point
        Dim ArmeeID As String
        Private Function TexturExists(ByVal ID As Textur.Animations) As Boolean
            For I = 0 To Texturs.Count - 1
                If Texturs(I).Name = ID Then
                    Return True
                End If
            Next
            Return False
        End Function
        Public Sub New(ByVal EinheitenID As String, ByVal Bildgroesse As Size, ByVal Armee As String, ByVal Movingframes As Integer, ByVal Stoppingframes As Integer, ByVal Einheitenzahl As Integer, ByVal EinzelUnitPosition As Point, Optional ByRef Existiert As Integer = 6)
            Me.ArmeeID = GetArmyOutFit(Armee)
            Texturs = New List(Of Textur)
            Me.EinheitenID = EinheitenID
            Me.Bildgroesse = Bildgroesse
            Me.MovementFrames = Movingframes
            Me.Stoppingframes = Stoppingframes
            Me.EinzelUnitPosition = EinzelUnitPosition
            Me.Truppenzahl = Einheitenzahl
            Dim Pfad As String = DataSettings.Resourcenpfad + "Battle\Unit Animations\" + EinheitenID + "\" + EinheitenID
            If Armee = "" Then

                If My.Computer.FileSystem.FileExists(Pfad + "+Laufen.png") Then
                    Dim B As Image = Image.FromFile(Pfad + "+Laufen.png")
                    Texturs.Add(New Textur)
                    Texturs(Texturs.Count - 1).Maintextur = Grafikengine.LoadTexture(B)
                    B = Image.FromFile(Pfad + "+Laufen+Maske.png")
                    Texturs(Texturs.Count - 1).MainMask = Grafikengine.LoadTexture(B)
                    Texturs(Texturs.Count - 1).Name = Textur.Animations.Walk
                End If
                If My.Computer.FileSystem.FileExists(Pfad + "+Waffe1.png") Then
                    Dim B As Image = Image.FromFile(Pfad + "+Waffe1.png")
                    Texturs.Add(New Textur)
                    Texturs(Texturs.Count - 1).Maintextur = Grafikengine.LoadTexture(B)
                    B = Image.FromFile(Pfad + "+Waffe1+Maske.png")
                    Texturs(Texturs.Count - 1).MainMask = Grafikengine.LoadTexture(B)
                    Texturs(Texturs.Count - 1).Frames = B.Width / Bildgroesse.Width - 1
                    Texturs(Texturs.Count - 1).Name = Textur.Animations.Weapon1_Normal
                End If
                If My.Computer.FileSystem.FileExists(Pfad + "+Waffe2.png") Then
                    Dim B As Image = Image.FromFile(Pfad + "+Waffe2.png")
                    Texturs.Add(New Textur)
                    Texturs(Texturs.Count - 1).Maintextur = Grafikengine.LoadTexture(B)
                    Texturs(Texturs.Count - 1).Frames = B.Width / Bildgroesse.Width - 1
                    B = Image.FromFile(Pfad + "+Waffe2+Maske.png")
                    Texturs(Texturs.Count - 1).MainMask = Grafikengine.LoadTexture(B)
                    Texturs(Texturs.Count - 1).Name = Textur.Animations.Weapon2_Normal
                End If
                If Texturs.Count = 0 Then
                    If My.Computer.FileSystem.FileExists(Pfad + ".png") Then
                        Dim B As Image = Image.FromFile(Pfad + ".png")
                        Texturs.Add(New Textur)
                        Texturs(Texturs.Count - 1).Maintextur = Grafikengine.LoadTexture(B)
                        B = Image.FromFile(Pfad + "+Maske.png")
                        Texturs(Texturs.Count - 1).MainMask = Grafikengine.LoadTexture(B)
                        Texturs(Texturs.Count - 1).Name = Textur.Animations.Walk
                    End If
                End If
            Else
                If My.Computer.FileSystem.FileExists(Pfad + "+" + Armee + "+Laufen.png") Then
                    Dim B As Image = Image.FromFile(Pfad + "+" + Armee + "+Laufen.png")
                    Texturs.Add(New Textur)
                    Texturs(Texturs.Count - 1).Maintextur = Grafikengine.LoadTexture(B)
                    B = Image.FromFile(Pfad + "+" + Armee + "+Laufen+Maske.png")
                    Texturs(Texturs.Count - 1).MainMask = Grafikengine.LoadTexture(B)
                    Texturs(Texturs.Count - 1).Name = Textur.Animations.Walk
                Else
                    Existiert -= 1
                End If
                If My.Computer.FileSystem.FileExists(Pfad + "+" + Armee + "+Waffe1.png") Then
                    Dim B As Image = Image.FromFile(Pfad + "+" + Armee + "+Waffe1.png")
                    Texturs.Add(New Textur)
                    Texturs(Texturs.Count - 1).MainMask = Grafikengine.LoadTexture(B)
                    B = Image.FromFile(Pfad + "+" + Armee + "+Waffe1+Maske.png")
                    Texturs(Texturs.Count - 1).Maintextur = Grafikengine.LoadTexture(B)
                    Texturs(Texturs.Count - 1).Frames = B.Width / Bildgroesse.Width - 1
                    Texturs(Texturs.Count - 1).Name = Textur.Animations.Weapon1_Normal
                Else
                    Existiert -= 1
                End If
                If My.Computer.FileSystem.FileExists(Pfad + "+" + Armee + "+Waffe2.png") Then
                    Dim B As Image = Image.FromFile(Pfad + "+" + Armee + "+Waffe2.png")
                    Texturs.Add(New Textur)
                    Texturs(Texturs.Count - 1).Maintextur = Grafikengine.LoadTexture(B)
                    B = Image.FromFile(Pfad + "+" + Armee + "+Waffe2+Maske.png")
                    Texturs(Texturs.Count - 1).MainMask = Grafikengine.LoadTexture(B)
                    Texturs(Texturs.Count - 1).Frames = B.Width / Bildgroesse.Width - 1
                    Texturs(Texturs.Count - 1).Name = Textur.Animations.Weapon2_Normal
                Else
                    Existiert -= 1
                End If
                If Existiert > 0 Then
                    If Not TexturExists(Textur.Animations.Walk) Then
                        If My.Computer.FileSystem.FileExists(Pfad + "+" + Armee + ".png") Then
                            Dim B As Image = Image.FromFile(Pfad + "+" + Armee + ".png")
                            Texturs.Add(New Textur)
                            Texturs(Texturs.Count - 1).Maintextur = Grafikengine.LoadTexture(B)
                            B = Image.FromFile(Pfad + "+" + Armee + "+Maske.png")
                            Texturs(Texturs.Count - 1).MainMask = Grafikengine.LoadTexture(B)
                            Texturs(Texturs.Count - 1).Name = Textur.Animations.Walk
                        ElseIf My.Computer.FileSystem.FileExists(Pfad + "+OS.png") Then
                            Dim B As Image = Image.FromFile(Pfad + "+OS.png")
                            Texturs.Add(New Textur)
                            Texturs(Texturs.Count - 1).Maintextur = Grafikengine.LoadTexture(B)
                            B = Image.FromFile(Pfad + "+OS+Maske.png")
                            Texturs(Texturs.Count - 1).MainMask = Grafikengine.LoadTexture(B)
                            Texturs(Texturs.Count - 1).Name = Textur.Animations.Walk
                        End If
                    End If
                    If Not TexturExists(Textur.Animations.Weapon1_Normal) Then
                        If My.Computer.FileSystem.FileExists(Pfad + "+" + Armee + ".png") Then
                            Dim B As Image = Image.FromFile(Pfad + "+" + Armee + ".png")
                            Texturs.Add(New Textur)
                            Texturs(Texturs.Count - 1).Maintextur = Grafikengine.LoadTexture(B)
                            B = Image.FromFile(Pfad + "+" + Armee + "+Maske.png")
                            Texturs(Texturs.Count - 1).MainMask = Grafikengine.LoadTexture(B)
                            Texturs(Texturs.Count - 1).Frames = B.Width / Bildgroesse.Width - 1
                            Texturs(Texturs.Count - 1).Name = Textur.Animations.Weapon1_Normal
                        ElseIf My.Computer.FileSystem.FileExists(Pfad + "+OS.png") Then
                            Dim B As Image = Image.FromFile(Pfad + "+OS.png")
                            Texturs.Add(New Textur)
                            Texturs(Texturs.Count - 1).Maintextur = Grafikengine.LoadTexture(B)
                            B = Image.FromFile(Pfad + "+OS+Maske.png")
                            Texturs(Texturs.Count - 1).MainMask = Grafikengine.LoadTexture(B)
                            Texturs(Texturs.Count - 1).Frames = B.Width / Bildgroesse.Width - 1
                            Texturs(Texturs.Count - 1).Name = Textur.Animations.Weapon1_Normal
                        End If
                    End If
                    If Not TexturExists(Textur.Animations.Weapon2_Normal) Then
                        If My.Computer.FileSystem.FileExists(Pfad + "+" + Armee + ".png") Then
                            Dim B As Image = Image.FromFile(Pfad + "+" + Armee + ".png")
                            Texturs.Add(New Textur)
                            Texturs(Texturs.Count - 1).Maintextur = Grafikengine.LoadTexture(B)
                            B = Image.FromFile(Pfad + "+" + Armee + "+Maske.png")
                            Texturs(Texturs.Count - 1).MainMask = Grafikengine.LoadTexture(B)
                            Texturs(Texturs.Count - 1).Frames = B.Width / Bildgroesse.Width - 1
                            Texturs(Texturs.Count - 1).Name = Textur.Animations.Weapon2_Normal
                        ElseIf My.Computer.FileSystem.FileExists(Pfad + "+OS.png") Then
                            Dim B As Image = Image.FromFile(Pfad + "+OS.png")
                            Texturs.Add(New Textur)
                            Texturs(Texturs.Count - 1).Maintextur = Grafikengine.LoadTexture(B)
                            B = Image.FromFile(Pfad + "+OS+Maske.png")
                            Texturs(Texturs.Count - 1).MainMask = Grafikengine.LoadTexture(B)
                            Texturs(Texturs.Count - 1).Frames = B.Width / Bildgroesse.Width - 1
                            Texturs(Texturs.Count - 1).Name = Textur.Animations.Weapon2_Normal
                        End If
                    End If
                    If Texturs.Count = 0 Then
                        If My.Computer.FileSystem.FileExists(Pfad + ".png") Then
                            Dim B As Image = Image.FromFile(Pfad + ".png")
                            Texturs.Add(New Textur)
                            Texturs(Texturs.Count - 1).Maintextur = Grafikengine.LoadTexture(B)
                            B = Image.FromFile(Pfad + "+Maske.png")
                            Texturs(Texturs.Count - 1).MainMask = Grafikengine.LoadTexture(B)
                            Texturs(Texturs.Count - 1).Name = Textur.Animations.Walk
                        End If
                    End If

                    'Falls wir wenigstens eine Textur gefunden haben werden leere Texturen damit gefuellt
                    'Default laden
                    Pfad = DataSettings.Resourcenpfad + "Battle\Unit Animations\KPZ\KPZ"
                    If Texturs.Count = 0 Then
                        Dim B As Image = Image.FromFile(Pfad + "+OS+Laufen.png")
                        Texturs.Add(New Textur)
                        Texturs(Texturs.Count - 1).MainMask = Grafikengine.LoadTexture(B)
                        B = Image.FromFile(Pfad + "+OS+Laufen+Maske.png")
                        Texturs(Texturs.Count - 1).MainMask = Grafikengine.LoadTexture(B)
                        Texturs(Texturs.Count - 1).Name = Textur.Animations.Walk
                    End If
                End If
            End If
        End Sub
        ''' <summary>
        ''' eine Flache Kopie
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function Clone() As Object Implements System.ICloneable.Clone
            Dim K As Kampfanimation = MemberwiseClone()
            K.EinzelUnitPosition = New Point(EinzelUnitPosition.X, EinzelUnitPosition.Y)
            Return K
        End Function
        Public Function GetTexture(ByVal ID As Textur.Animations) As Texture
            For I = 0 To Texturs.Count - 1
                If Texturs(I).Name = ID Then
                    Return Texturs(I).Maintextur
                End If
            Next
            Return Texturs(0).Maintextur
        End Function
        Public Function GetTextureMask(ByVal ID As Textur.Animations) As Texture
            For I = 0 To Texturs.Count - 1
                If Texturs(I).Name = ID Then
                    Return Texturs(I).MainMask
                End If
            Next
            Return Texturs(0).MainMask
        End Function
        Public Function GetFrames(ByVal ID As Textur.Animations) As Integer
            For I = 0 To Texturs.Count - 1
                If Texturs(I).Name = ID Then
                    Return Texturs(I).Frames
                End If
            Next
            Return Texturs(0).Frames
        End Function
        Public Sub Dispose()
            For I = 0 To Texturs.Count - 1
                Texturs(I).MainMask.Dispose()
                Texturs(I).Maintextur.Dispose()
            Next
            Texturs.Clear()
            Grafikengine.Grafikkarte.EvictManagedResources()
        End Sub
    End Structure
    Public Structure EinheitenTextur
        Enum ArmeeEinheiten
            Alles
            NurKampfSprite
            Nichts
        End Enum
        Dim Kampfanimationen As Stack(Of Kampfanimation)
        Dim EinheitenID As String
        Dim Einheitentexturen() As Texture
        Dim EinheitentexturenMaske() As Texture
        Dim ETexturArmee As String()
        Dim Lauftextur() As Texture
        Dim LauftexturMaske() As Texture
        Dim LTexturArmee() As String
        Dim Bildgroesse() As Size
        Dim Einheit As ObjektEinheit
        Dim ArmeeEinheit As ArmeeEinheiten
        Public Sub New(ByVal EinheitenID As String)
            ArmeeEinheit = ArmeeEinheiten.Alles
            Me.Einheit = ObjektLadeklasse.NewEinheit(EinheitenID, -1, -1, -1)
            Me.EinheitenID = Einheit.EinheitenID
            LoadTexturen()
        End Sub
        Public Sub New(ByVal Einheiten As ObjektEinheit)
            ArmeeEinheit = ArmeeEinheiten.Nichts
            Me.Einheit = Einheiten
            Me.EinheitenID = Einheiten.EinheitenID
            LoadTexturen()
        End Sub
        Private Sub LoadTexturen()
            Kampfanimationen = New Stack(Of Kampfanimation)
            ArmeeEinheit = ArmeeEinheiten.NurKampfSprite
            Select Case Einheit.EinheitenID
                Case "ABPZ"
                    PanzerBildLaden("Amphibienpanzer", "ABPZ")
                    Kampfanimationen.Push(New Kampfanimation("ABPZ", New Size(100, 70), "", 0, 0, 5, New Point(0, 0))) 'Fertig
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "ART"
                    PanzerBildLaden("Artillerie", "ART")
                Case "AUFKLAERER"
                    PanzerBildLaden("Aufklaerer", "AUFKLAERER")
                    Kampfanimationen.Push(New Kampfanimation("AUFKLAERER", New Size(100, 70), "", 0, 0, 5, New Point(0, -40)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "BOMBER"
                    PanzerBildLaden("Bomber", "BOMBER")
                Case "FLAK"
                    PanzerBildLaden("Flak", "FLAK")
                Case "FLTR"
                    PanzerBildLaden("Flugzeugtraeger", "FLTR")
                    Kampfanimationen.Push(New Kampfanimation("FLTR", New Size(96, 83), "", 0, 0, 1, New Point(0, 100)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case MovementSorts.Hoellium.ToString.ToUpper
                    PanzerBildLaden(MovementSorts.Hoellium.ToString, MovementSorts.Hoellium.ToString.ToUpper)
                    Kampfanimationen.Push(New Kampfanimation(MovementSorts.Hoellium.ToString.ToUpper, New Size(104, 68), "", 0, 0, 1, New Point(11, 87))) 'Fertig
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "HOVERCRAFT"
                    PanzerBildLaden("Hovercraft", "HOVERCRAFT")
                    Kampfanimationen.Push(New Kampfanimation("HOVERCRAFT", New Size(100, 70), "", 0, 0, 5, New Point(0, 0)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "JGPZ"
                    PanzerBildLaden("Jagdpanzer", "JGPZ")
                Case "JAEGER"
                    PanzerBildLaden("Jaeger", "JAEGER")
                Case "K-HELI"
                    PanzerBildLaden("K-Heli", "K-HELI")
                Case "KPZ"
                    PanzerBildLaden("Kampfpanzer", "KPZ")
                Case "KREUZER"
                    PanzerBildLaden("Kreuzer", "KREUZER")
                Case "L-BOOT"
                    PanzerBildLaden("Landeboot", "L-BOOT")
                Case "LAEUFER"
                    PanzerBildLaden(MovementSorts.Laeufer.ToString, "LAEUFER")
                    Kampfanimationen.Push(New Kampfanimation("LAEUFER", New Size(66, 74), "", 0, 0, 1, New Point(31, 75))) 'Fertig
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "MEGAPZ"
                    PanzerBildLaden("Megapanzer", "MEGAPZ")
                    Kampfanimationen.Push(New Kampfanimation("MEGAPZ", New Size(108, 120), "", 0, 0, 1, New Point(8, 35)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "MISSILE"
                    PanzerBildLaden("Missile", "MISSILE")
                Case "RKW"
                    PanzerBildLaden("Raketenwerfer", "RKW")
                Case "SCHLFF"
                    PanzerBildLaden("Schlachtschiff", "SCHLFF")
                Case "S-BOMBE"
                    PanzerBildLaden("S-Bombe", "S-BOMBE")
                    Kampfanimationen.Push(New Kampfanimation("S-BOMBE", New Size(118, 80), "", 0, 0, 1, New Point(0, 4))) 'Fertig
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "S-BOOT"
                    PanzerBildLaden("S-Boot", "S-BOOT")
                    Kampfanimationen.Push(New Kampfanimation("S-BOOT", New Size(104, 73), "", 0, 0, 1, New Point(0, 119))) 'Fertig
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "SPAEHER"
                    PanzerBildLaden("Spaeher", "SPAEHER")
                Case "TARNK"
                    PanzerBildLaden("Tarnkappenbomber", "TARNK")
                    Kampfanimationen.Push(New Kampfanimation("TARNK", New Size(121, 60), "", 0, 0, 1, New Point(3, 40)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "TITANPZ"
                    PanzerBildLaden("Titanpanzer", "TITANPZ")
                    Kampfanimationen.Push(New Kampfanimation("TITANPZ", New Size(100, 70), "", 4, 3, 5, New Point(0, 0)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "T-FLUGZEUG"
                    PanzerBildLaden("Transportflugzeug", "T-FLUGZEUG")
                    Kampfanimationen.Push(New Kampfanimation("T-FLUGZEUG", New Size(104, 91), "", 0, 0, 1, New Point(0, 2))) 'Fertig
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "T-HELI"
                    PanzerBildLaden("T-Heli", "T-HELI")
                Case "TTL"
                    PanzerBildLaden("TTLaeufer", "TTL")
                    Kampfanimationen.Push(New Kampfanimation("TTL", New Size(64, 80), "", 0, 0, 1, New Point(31, 75)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "TTP"
                    PanzerBildLaden("TTP", "TTP")
                Case "U-BOOT"
                    PanzerBildLaden("U-Boot", "U-BOOT")
                Case "ZEPPELIN"
                    PanzerBildLaden("Zeppelin", "ZEPPELIN")
                    Kampfanimationen.Push(New Kampfanimation("ZEPPELIN", New Size(127, 113), "", 0, 0, 1, New Point(0, 0)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "ZERSTOERER"
                    PanzerBildLaden("Zerstoerer", "ZERSTOERER")
                    Kampfanimationen.Push(New Kampfanimation("ZERSTOERER", New Size(113, 114), "", 0, 0, 1, New Point(0, 78)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "VERSORGUNGSSCHIFF"
                    PanzerBildLaden("Versorgungsschiff", "VERSORGUNGSSCHIFF")
                    Kampfanimationen.Push(New Kampfanimation("VERSORGUNGSSCHIFF", New Size(108, 112), "", 0, 0, 1, New Point(0, 80)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "BAUPANZER"
                    PanzerBildLaden("Baupanzer", "BAUPANZER")
                    Kampfanimationen.Push(New Kampfanimation("BAUPANZER", New Size(100, 46), "", 0, 0, 1, New Point(13, 120))) 'Fertig
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "HOVERFLAK"
                    PanzerBildLaden("Hoverflak", "HOVERFLAK")
                    Kampfanimationen.Push(New Kampfanimation("HOVERFLAK", New Size(100, 70), "", 0, 0, 5, New Point(0, 0)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "SCHWERESHOVERCRAFT"
                    PanzerBildLaden("Schweres Hovercraft", "SCHWERESHOVERCRAFT")
                    Kampfanimationen.Push(New Kampfanimation("SCHWERESHOVERCRAFT", New Size(100, 70), "", 0, 0, 5, New Point(0, 0)))
                    ArmeeEinheit = ArmeeEinheiten.Nichts
                Case "FLARE"
                    PanzerBildLaden("Flare", "FLARE")
                Case "PANZERABWEHRKANONE"
                    PanzerBildLaden("Panzerabwehrkanone", "PANZERABWEHRKANONE")
                Case "WASSERFLUGZEUG"
                    PanzerBildLaden("Wasserflugzeug", "WASSERFLUGZEUG")
                Case "KANONENBOOT"
                    PanzerBildLaden("Kanonenboot", "KANONENBOOT")
                Case Else 'Custom Unit kein Plan wie wir das machen!
                    If TypeOf Einheit Is EinheitCustom Then
                        CustomBildLaden(EinheitenID, EinheitenID)
                        Kampfanimationen.Push(New Kampfanimation("TITANPZ", New Size(100, 70), "", 0, 0, 5, New Point(0, 0)))
                        ArmeeEinheit = ArmeeEinheiten.Nichts
                    Else
                        PanzerBildLaden(EinheitenID, EinheitenID)
                    End If

            End Select
        End Sub
        ''' <summary>
        ''' 
        ''' </summary>
        ''' <param name="Spieler"></param>
        ''' <remarks></remarks>
        Public Sub LoadArmeeTexturen(ByVal Spieler() As ObjektSpieler)
            Objektverwalter.AlleEinheitenLocker.Lock()
            If ArmeeEinheit = ArmeeEinheiten.Nichts Then Exit Sub
            Dim Armee As New Stack(Of String)
            For I = 0 To Spieler.Length - 1
                If Spieler(I).Armee <> "" Then
                    If Not Armee.Contains(GetArmyOutFit(Spieler(I).Armee)) Then
                        Armee.Push(GetArmyOutFit(Spieler(I).Armee))
                    End If
                End If
            Next

            If ArmeeEinheit = ArmeeEinheiten.Alles Then
                If Einheitentexturen IsNot Nothing Then
                    For I = 0 To Einheitentexturen.Length - 1
                        Einheitentexturen(I).Dispose()
                    Next
                End If
                Array.Resize(Einheitentexturen, 0)
                If Lauftextur IsNot Nothing Then
                    For I = 0 To Lauftextur.Length - 1
                        Lauftextur(I).Dispose()
                    Next
                End If
                Array.Resize(Lauftextur, 0)
                If EinheitentexturenMaske IsNot Nothing Then
                    For I = 0 To EinheitentexturenMaske.Length - 1
                        EinheitentexturenMaske(I).Dispose()
                    Next
                End If
                Array.Resize(EinheitentexturenMaske, 0)
                If LauftexturMaske IsNot Nothing Then
                    For I = 0 To LauftexturMaske.Length - 1
                        LauftexturMaske(I).Dispose()
                    Next
                End If
                Array.Resize(LauftexturMaske, 0)
            End If
            If ArmeeEinheit <= ArmeeEinheiten.NurKampfSprite Then
                If Kampfanimationen IsNot Nothing Then
                    For I = 0 To Kampfanimationen.Count - 1
                        Kampfanimationen(I).Dispose()
                    Next
                    Kampfanimationen.Clear()
                End If
            End If
            If Grafikengine.Grafikkarte IsNot Nothing Then
                Grafikengine.Grafikkarte.EvictManagedResources()
            End If
            Dim K As Kampfanimation
            Select Case Einheit.EinheitenID
                Case "ART"
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("ART", New Size(100, 70), Armee(I), 0, 0, 5, New Point(0, 0), E) 'Fertig
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("ART", New Size(100, 70), Armeen.OS.ToString, 0, 0, 5, New Point(0, 0))) 'Fertig
                    End If
                Case "BOMBER"
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("BOMBER", New Size(127, 120), Armee(I), 0, 0, 1, New Point(0, 0), E)
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("BOMBER", New Size(127, 120), Armeen.OS.ToString, 0, 0, 1, New Point(0, 0)))
                    End If
                Case "FLAK"
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("FLAK", New Size(100, 70), Armee(I), 6, 4, 5, New Point(0, 0), E)
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("FLAK", New Size(100, 70), Armeen.OS.ToString, 0, 0, 5, New Point(0, 0)))
                    End If
                Case "INF"
                    InfanterieBildLaden("Infanterie", "INF", Armee.ToArray)
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("INF", New Size(100, 70), Armee(I), 12, 0, 5, New Point(0, 0), E) 'Fertig
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("INF", New Size(100, 70), Armeen.OS.ToString, 12, 0, 5, New Point(0, 0))) 'Fertig
                    End If
                Case "JGPZ"
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("JGPZ", New Size(100, 70), Armee(I), 4, 4, 5, New Point(0, 0), E) 'Fertig
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("JGPZ", New Size(100, 70), Armeen.OS.ToString, 4, 4, 5, New Point(0, 0))) 'Fertig
                    End If
                Case "JAEGER"
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("JAEGER", New Size(100, 70), Armee(I), 0, 0, 5, New Point(0, -30), E)
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("JAEGER", New Size(100, 70), Armeen.OS.ToString, 0, 0, 5, New Point(0, -30)))
                    End If
                Case "K-HELI"
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("K-HELI", New Size(100, 70), Armee(I), 0, 0, 5, New Point(0, -40), E)
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("K-HELI", New Size(100, 70), Armeen.OS.ToString, 0, 0, 5, New Point(0, -40)))
                    End If
                Case "KPZ"
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("KPZ", New Size(100, 70), Armee(I), 4, 4, 5, New Point(0, 0), E) 'Fertig
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("KPZ", New Size(100, 70), Armeen.OS.ToString, 4, 4, 5, New Point(0, 0))) 'Fertig
                    End If
                Case "KREUZER"
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("KREUZER", New Size(105, 102), Armee(I), 0, 0, 1, New Point(0, 90), E)
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("KREUZER", New Size(105, 102), Armeen.OS.ToString, 0, 0, 1, New Point(0, 90)))
                    End If
                Case "L-BOOT"
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("L-BOOT", New Size(111, 96), Armee(I), 0, 0, 1, New Point(0, 96), E) 'Fertig
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("L-BOOT", New Size(111, 96), Armeen.OS.ToString, 0, 0, 1, New Point(0, 96))) 'Fertig
                    End If
                Case "MECH"
                    InfanterieBildLaden(MovementSorts.Mech.ToString, MovementSorts.Mech.ToString.ToUpper, Armee.ToArray)
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation(MovementSorts.Mech.ToString.ToUpper, New Size(100, 70), Armee(I), 12, 1, 5, New Point(0, 0), E) 'Fertig
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation(MovementSorts.Mech.ToString.ToUpper, New Size(100, 70), Armeen.OS.ToString, 12, 1, 5, New Point(0, 0))) 'Fertig
                    End If
                Case "MISSILE"
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("MISSILE", New Size(100, 70), Armee(I), 0, 0, 5, New Point(0, 0), E)
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("MISSILE", New Size(100, 70), Armeen.OS.ToString, 0, 0, 5, New Point(0, 0)))
                    End If
                Case "RKW"
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("RKW", New Size(100, 70), Armee(I), 0, 0, 5, New Point(0, 0), E) 'Fertig
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("RKW", New Size(100, 70), Armeen.OS.ToString, 0, 0, 5, New Point(0, 0))) 'Fertig
                    End If
                Case "SSIEINHEIT"
                    InfanterieBildLaden("Scharfschuetze", "SSIEINHEIT", Armee.ToArray)
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("SSIEINHEIT", New Size(100, 70), Armee(I), 0, 0, 5, New Point(0, 0), E)
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("SSIEINHEIT", New Size(100, 70), Armeen.OS.ToString, 0, 0, 5, New Point(0, 0)))
                    End If
                Case "SCHLFF"
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("SCHLFF", New Size(111, 128), Armee(I), 0, 0, 1, New Point(0, 64), E)
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("SCHLFF", New Size(111, 128), Armeen.OS.ToString, 0, 0, 1, New Point(0, 64)))
                    End If
                Case "SPAEHER"
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("SPAEHER", New Size(100, 70), Armee(I), 4, 4, 5, New Point(0, 0), E) 'Fertig
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("SPAEHER", New Size(100, 70), Armeen.OS.ToString, 4, 4, 5, New Point(0, 0))) 'Fertig
                    End If
                Case "T-HELI"
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("T-HELI", New Size(118, 84), Armee(I), 0, 0, 1, New Point(4, 20), E) 'Fertig
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("T-HELI", New Size(118, 84), Armeen.OS.ToString, 0, 0, 1, New Point(4, 20))) 'Fertig
                    End If
                Case "TTP"
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("TTP", New Size(100, 75), Armee(I), 0, 0, 1, New Point(13, 80), E) 'Fertig
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("TTP", New Size(100, 75), Armeen.OS.ToString, 0, 0, 1, New Point(13, 80))) 'Fertig
                    End If
                Case "U-BOOT"
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("U-BOOT", New Size(93, 80), Armee(I), 0, 0, 1, New Point(0, 112), E)
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("U-BOOT", New Size(93, 80), Armeen.OS.ToString, 0, 0, 1, New Point(0, 112)))
                    End If
                Case "MOTORRAD"
                    InfanterieBildLaden("Motorrad", "MOTORRAD", Armee.ToArray)
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("MOTORRAD", New Size(54, 40), Armee(I), 0, 0, 5, New Point(0, 0), E)
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("MOTORRAD", New Size(54, 40), Armeen.OS.ToString, 0, 0, 5, New Point(0, 0)))
                    End If
                Case "FLARE"
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("FLARE", New Size(58, 44), Armee(I), 0, 0, 5, New Point(0, 0), E)
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("FLARE", New Size(58, 44), Armeen.OS.ToString, 0, 0, 5, New Point(0, 0)))
                    End If
                Case "PANZERABWEHRKANONE"
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("PANZERABWEHRKANONE", New Size(68, 45), Armee(I), 0, 0, 5, New Point(0, 0), E)
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("PANZERABWEHRKANONE", New Size(68, 45), Armeen.OS.ToString, 0, 0, 5, New Point(0, 0)))
                    End If
                Case "WASSERFLUGZEUG"
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("WASSERFLUGZEUG", New Size(57, 39), Armee(I), 0, 0, 5, New Point(0, -40), E)
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("WASSERFLUGZEUG", New Size(57, 39), Armeen.OS.ToString, 0, 0, 5, New Point(0, -40)))
                    End If
                Case "KANONENBOOT"
                    For I = 0 To Armee.Count - 1
                        Dim E As Integer = 3
                        K = New Kampfanimation("KANONENBOOT", New Size(64, 58), Armee(I), 0, 0, 5, New Point(0, 0), E)
                        If E > 0 Then
                            Kampfanimationen.Push(K)
                        End If
                    Next
                    If Kampfanimationen.Count = 0 Then
                        Kampfanimationen.Push(New Kampfanimation("KANONENBOOT", New Size(64, 58), Armeen.OS.ToString, 0, 0, 5, New Point(0, 0)))
                    End If
            End Select
            Objektverwalter.AlleEinheitenLocker.Unlock()
        End Sub

        ''' <summary>
        ''' Laedt ein Infanterie Bild
        ''' </summary>
        ''' <param name="Bildname"></param>
        ''' <param name="EinheitenID"></param>
        ''' <remarks></remarks>
        Private Sub InfanterieBildLaden(ByVal Bildname As String, ByVal EinheitenID As String, ByVal Armee As String())
            Dim MainOrdner As String = "CW\"
            ReDim Einheitentexturen(-1)
            ReDim EinheitentexturenMaske(-1)
            ReDim ETexturArmee(-1)
            ReDim Lauftextur(-1)
            ReDim LauftexturMaske(-1)
            ReDim LTexturArmee(-1)
            ReDim Bildgroesse(-1)
            MainOrdner = ObjektLadeklasse.GetOrdner

            For I = 0 To Armee.Length - 1

                'So steh Textur laden!
                Dim Ordner As String = MainOrdner
                Dim Army As String = Armee(I)
                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+" + Army + ".png") = False Then
                    If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+OS.png") Then
                        GoTo LauftexturLaden
                    Else
                        If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Units\Overworld\CW\" + Bildname + "+" + Army + ".png") Then
                            Ordner = "CW\"
                        Else
                            GoTo LauftexturLaden
                        End If
                    End If
                End If
                Array.Resize(Einheitentexturen, Einheitentexturen.Length + 1)
                Array.Resize(EinheitentexturenMaske, EinheitentexturenMaske.Length + 1)
                Array.Resize(ETexturArmee, ETexturArmee.Length + 1)
                Dim Bild As Image = Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+" + Army + ".png")
                Einheitentexturen(Einheitentexturen.Length - 1) = Grafikengine.LoadTexture(Bild)
                EinheitentexturenMaske(EinheitentexturenMaske.Length - 1) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+" + Army + "+Maske.png"))
                ETexturArmee(ETexturArmee.Length - 1) = Army
LauftexturLaden:
                'Lauftextur Laden
                Ordner = MainOrdner
                Army = Armee(I)
                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+" + Army + "+Laufen.png") = False Then
                    If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+OS+Laufen.png") Then
                        Continue For
                    Else
                        Ordner = "CW\"
                        If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+" + Army + "+Laufen.png") = False Then
                            Continue For
                        End If
                    End If
                End If
                Array.Resize(Lauftextur, Lauftextur.Length + 1)
                Array.Resize(LauftexturMaske, LauftexturMaske.Length + 1)
                Array.Resize(LTexturArmee, LTexturArmee.Length + 1)
                Array.Resize(Bildgroesse, Bildgroesse.Length + 1)
                LTexturArmee(LTexturArmee.Length - 1) = Army

                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+" + Army + "+Laufen.png") = True Then
                    Bild = Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+" + Army + "+Laufen.png")
                    Lauftextur(Lauftextur.Length - 1) = Grafikengine.LoadTexture(Bild)
                    LauftexturMaske(Lauftextur.Length - 1) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+" + Army + "+Laufen+Maske.png"))
                Else
                    Bild = Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + "TTP+Laufen.png")
                    Lauftextur(Lauftextur.Length - 1) = Grafikengine.LoadTexture(Bild)
                    LauftexturMaske(Lauftextur.Length - 1) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + "TTP+Laufen+Maske.png"))
                End If
                Bildgroesse(Bildgroesse.Length - 1).Width = Bild.Width / 4
                Bildgroesse(Bildgroesse.Length - 1).Height = Bild.Height / 4
            Next
            If Einheitentexturen.Length = 0 Then
                ReDim Einheitentexturen(0)
                ReDim EinheitentexturenMaske(0)
                ReDim ETexturArmee(0)
                Dim Ordner As String = MainOrdner
                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+OS.png") = False Then
                    If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+OS.png") Then
                    Else
                        Ordner = "CW\"
                    End If
                End If
                Dim Bild As Image = Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+OS.png")
                Einheitentexturen(Einheitentexturen.Length - 1) = Grafikengine.LoadTexture(Bild)
                EinheitentexturenMaske(Einheitentexturen.Length - 1) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+OS+Maske.png"))
                ETexturArmee(Einheitentexturen.Length - 1) = Armeen.OS.ToString
            End If
            If Lauftextur.Length = 0 Then
                Dim Ordner As String = MainOrdner
                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+OS+Laufen.png") = False Then
                    If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+OS+Laufen.png") Then
                    Else
                        Ordner = "CW\"
                    End If
                End If
                ReDim Lauftextur(0)
                ReDim LauftexturMaske(0)
                ReDim LTexturArmee(0)
                ReDim Bildgroesse(0)
                Dim Bild As Image
                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+OS+Laufen.png") = True Then
                    Bild = Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+OS+Laufen.png")
                    Lauftextur(0) = Grafikengine.LoadTexture(Bild)
                    LauftexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+OS+Laufen+Maske.png"))
                Else
                    Bild = Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + "TTP+Laufen.png")
                    Lauftextur(0) = Grafikengine.LoadTexture(Bild)
                    LauftexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + "TTP+Laufen+Maske.png"))
                End If
                Bildgroesse(0).Width = Bild.Width / 4
                Bildgroesse(0).Height = Bild.Height / 4
            End If
            Me.EinheitenID = EinheitenID
        End Sub
        Private Sub PanzerBildLaden(ByVal Bildname As String, ByVal EinheitenID As String)
            Dim MainOrdner As String = ObjektLadeklasse.GetOrdner
            Array.Resize(Einheitentexturen, 1)
            Array.Resize(EinheitentexturenMaske, 1)
            Array.Resize(Lauftextur, 1)
            Array.Resize(LauftexturMaske, 1)
            Array.Resize(Bildgroesse, 1)
            Dim Ordner As String = MainOrdner
            Dim Bild As Image
            If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + ".png") Then
                Bild = Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + ".png")
                Einheitentexturen(0) = Grafikengine.LoadTexture(Bild)
                EinheitentexturenMaske(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+Maske.png"))
            ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Units\Overworld\CW\" + Bildname + ".png") Then
                Bild = Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\CW\" + Bildname + ".png")
                Einheitentexturen(0) = Grafikengine.LoadTexture(Bild)
                EinheitentexturenMaske(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\CW\" + Bildname + "+Maske.png"))
            Else
                Bild = Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\CW\TTP.png")
                Einheitentexturen(0) = Grafikengine.LoadTexture(Bild)
                EinheitentexturenMaske(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\CW\TTP+Maske.png"))
            End If
            'Lauftextur Laden!!!

            If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+Laufen.png") = True Then
                Bild = Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+Laufen.png")
                Lauftextur(0) = Grafikengine.LoadTexture(Bild)
                LauftexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\" + Ordner + Bildname + "+Laufen+Maske.png"))
            ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Units\Overworld\CW\" + Bildname + "+Laufen.png") Then
                Bild = Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\CW\" + Bildname + "+Laufen.png")
                Lauftextur(0) = Grafikengine.LoadTexture(Bild)
                LauftexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\CW\" + Bildname + "+Laufen+Maske.png"))
            Else
                Bild = Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\CW\TTP+Laufen.png")
                Lauftextur(0) = Grafikengine.LoadTexture(Bild)
                LauftexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\CW\TTP+Laufen+Maske.png"))
            End If
            Bildgroesse(0).Width = Bild.Width / 4
            Bildgroesse(0).Height = Bild.Height / 4
            EinheitenID = EinheitenID
        End Sub
        ''' <summary>
        ''' Laedt das Bild einer Custom Einheit...
        ''' </summary>
        ''' <param name="Bildname"></param>
        ''' <param name="EinheitenID"></param>
        ''' <remarks></remarks>
        Private Sub CustomBildLaden(ByVal Bildname As String, ByVal EinheitenID As String)
            Array.Resize(Einheitentexturen, 1)
            Array.Resize(EinheitentexturenMaske, 1)
            Array.Resize(Lauftextur, 1)
            Array.Resize(LauftexturMaske, 1)
            Array.Resize(Bildgroesse, 1)
            Dim Ordner As String = ""
            'A joined player should use these units for a Multiplayer Game
            If Hauptmenue.Connection.Connected And Not Hauptmenue.Connection.Hosten Then
                Ordner += "Multiplayer\"
            End If
            Select Case DataSettings.CommanderWarsGameModus
                Case CommanderWarsGameModi.CommanderWars2
                    Ordner += "(Optional) Zoomed Out\"
                Case Else
                    Ordner += ""
            End Select
            Dim Bild As Image
            If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "!Custom\Unit\Sprites\" + Ordner + Bildname + ".png") Then
                Bild = Image.FromFile(DataSettings.Resourcenpfad + "!Custom\Unit\Sprites\" + Ordner + Bildname + ".png")
                Einheitentexturen(0) = Grafikengine.LoadTexture(Bild)
                EinheitentexturenMaske(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "!Custom\Unit\Sprites\" + Ordner + Bildname + "+Maske.png"))
            ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "!Custom\Unit\Sprites\CW\" + Bildname + ".png") Then
                Bild = Image.FromFile(DataSettings.Resourcenpfad + "!Custom\Unit\Sprites\" + Bildname + ".png")
                Einheitentexturen(0) = Grafikengine.LoadTexture(Bild)
                EinheitentexturenMaske(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "!Custom\Unit\Sprites\" + Bildname + "+Maske.png"))
            Else
                Bild = Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\CW\TTP.png")
                Einheitentexturen(0) = Grafikengine.LoadTexture(Bild)
                EinheitentexturenMaske(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\CW\TTP+Maske.png"))
            End If
            'Lauftextur Laden!!!

            If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "!Custom\Unit\Sprites\" + Ordner + Bildname + "+Laufen.png") = True Then
                Bild = Image.FromFile(DataSettings.Resourcenpfad + "!Custom\Unit\Sprites\" + Ordner + Bildname + "+Laufen.png")
                Lauftextur(0) = Grafikengine.LoadTexture(Bild)
                LauftexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "!Custom\Unit\Sprites\" + Ordner + Bildname + "+Laufen+Maske.png"))
            ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "!Custom\Unit\Sprites\" + Bildname + "+Laufen.png") Then
                Bild = Image.FromFile(DataSettings.Resourcenpfad + "!Custom\Unit\Sprites\" + Bildname + "+Laufen.png")
                Lauftextur(0) = Grafikengine.LoadTexture(Bild)
                LauftexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "!Custom\Unit\Sprites\" + Bildname + "+Laufen+Maske.png"))
            Else
                Bild = Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\CW\TTP+Laufen.png")
                Lauftextur(0) = Grafikengine.LoadTexture(Bild)
                LauftexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Units\Overworld\CW\TTP+Laufen+Maske.png"))
            End If
            Bildgroesse(0).Width = Bild.Width / 4
            Bildgroesse(0).Height = Bild.Height / 4
            EinheitenID = EinheitenID
        End Sub
        ''' <summary>
        ''' Die Lauftextur wird zurueck gegeben.
        ''' </summary>
        ''' <param name="Armee"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function GetLauftextur(ByVal Armee As String) As Texture
            Armee = GetArmyOutFit(Armee)
            If Lauftextur.Length = 1 Then
                Return Lauftextur(0)
            ElseIf Lauftextur.Length = 0 Then
                Return Nothing
            Else
                For I = 0 To LTexturArmee.Length - 1
                    If LTexturArmee(I) = Armee Then
                        Return Lauftextur(I)
                    End If
                Next
                Return Lauftextur(0)
            End If
        End Function
        ''' <summary>
        ''' Die Bildgroesse wird zurueck gegeben.
        ''' </summary>
        ''' <param name="Armee"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function GetBildgroesse(ByVal Armee As String) As Size
            Armee = GetArmyOutFit(Armee)
            If Bildgroesse.Length = 1 Then
                Return Bildgroesse(0)
            Else
                For I = 0 To LTexturArmee.Length - 1
                    If LTexturArmee(I) = Armee Then
                        Return Bildgroesse(I)
                    End If
                Next
                Return Bildgroesse(0)
            End If
        End Function
        ''' <summary>
        ''' Die Lauftextur wird zurueck gegeben.
        ''' </summary>
        ''' <param name="Armee"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function GetLauftexturMaske(ByVal Armee As String) As Texture
            Armee = GetArmyOutFit(Armee)
            If LauftexturMaske.Length = 1 Then
                Return LauftexturMaske(0)
            ElseIf Lauftextur.Length = 0 Then
                Return Nothing
            Else
                For I = 0 To LTexturArmee.Length - 1
                    If LTexturArmee(I) = Armee Then
                        Return LauftexturMaske(I)
                    End If
                Next
                Return LauftexturMaske(0)
            End If
        End Function
        ''' <summary>
        ''' Die Einheitentexturen wird zurueck gegeben.
        ''' </summary>
        ''' <param name="Armee"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function GetEinheitentextur(ByVal Armee As String) As Texture
            Armee = GetArmyOutFit(Armee)
            If Einheitentexturen.Length = 1 Then
                Return Einheitentexturen(0)
            ElseIf Lauftextur.Length = 0 Then
                Return Nothing
            Else
                For I = 0 To ETexturArmee.Length - 1
                    If ETexturArmee(I) = Armee Then
                        Return Einheitentexturen(I)
                    End If
                Next
                Return Einheitentexturen(0)
            End If
        End Function
        ''' <summary>
        ''' Die Einheitentexturen wird zurueck gegeben.
        ''' </summary>
        ''' <param name="Armee"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function GetEinheitentexturMaske(ByVal Armee As String) As Texture
            Armee = GetArmyOutFit(Armee)
            If EinheitentexturenMaske.Length = 1 Then
                Return EinheitentexturenMaske(0)
            ElseIf Lauftextur.Length = 0 Then
                Return Nothing
            Else
                For I = 0 To ETexturArmee.Length - 1
                    If ETexturArmee(I) = Armee Then
                        Return EinheitentexturenMaske(I)
                    End If
                Next
                Return EinheitentexturenMaske(0)
            End If
        End Function
        ''' <summary>
        ''' Die Einheitentexturen wird zurueck gegeben.
        ''' </summary>
        ''' <param name="Armee"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function GetKampfAnimation(ByVal Armee As String) As Kampfanimation
            Armee = GetArmyOutFit(Armee)
            If Kampfanimationen.Count = 1 Then
                Return Kampfanimationen(0)
            Else
                For I = 0 To Kampfanimationen.Count - 1
                    If Kampfanimationen(I).ArmeeID = Armee Then
                        Return Kampfanimationen(I)
                    End If
                Next
                Return Kampfanimationen(0)
            End If
        End Function
        Public Shared Function GetUnitID(ByVal EID As String) As Integer
            For I = 0 To AlleEinheiten.Length - 1
                If AlleEinheiten(I).EinheitenID = EID Then
                    Return I
                End If
            Next
            Return -1
        End Function
        Public Sub Reset()
            For I = 0 To Einheitentexturen.Length - 1
                Einheitentexturen(I).Dispose()
                Einheitentexturen(I) = Nothing
            Next
            For I = 0 To EinheitentexturenMaske.Length - 1
                EinheitentexturenMaske(I).Dispose()
                EinheitentexturenMaske(I) = Nothing
            Next
            For i = 0 To Lauftextur.Length - 1
                Lauftextur(i).Dispose()
                Lauftextur(i) = Nothing
            Next
            For i = 0 To LauftexturMaske.Length - 1
                LauftexturMaske(i).Dispose()
                LauftexturMaske(i) = Nothing
            Next
            For I = 0 To Kampfanimationen.Count - 1
                Kampfanimationen(I).Dispose()
            Next
            Kampfanimationen.Clear()
            Grafikengine.Grafikkarte.EvictManagedResources()
        End Sub
    End Structure
#End Region
#Region "Gebaeude"
    Public Structure GebaeudeTextur
        Dim Gebaeudetextur() As Texture
        Dim GebaeudetexturMaske() As Texture
        Dim Armee() As String
        Dim SymbolTextur As Texture
        Dim SymbolTexturMaske As Texture

        Dim GebaeudeID As String

        Dim GebaeudetexturNeutral As Texture
        Dim SymbolTexturNeutral As Texture

        Dim NurNeutral As Boolean
        Dim SpezialGebaeude As Boolean
        Public Sub New(ByVal GebaeudeID As String, ByVal SpezialGebaeude As Boolean, ByVal neuTextur As String, ByVal NurNeutral As Boolean)

            Dim Ordner As String = ObjektLadeklasse.GetOrdner
            Me.GebaeudeID = GebaeudeID
            Me.NurNeutral = NurNeutral
            Me.SpezialGebaeude = SpezialGebaeude
            If SpezialGebaeude Then
                LoadSpezialGebaeude(False, neuTextur, Ordner)
                LoadSpezialGebaeude(True, neuTextur, Ordner)
            Else
                If GebaeudeID = "HQ" Then
                    LoadHQ(Ordner, True, Nothing)
                    LoadHQ(Ordner, False, Nothing)
                Else
                    LoadGebaeude(neuTextur, Ordner, True)
                    LoadGebaeude(neuTextur, Ordner, False)
                End If
            End If
        End Sub
        Private Sub LoadGebaeude(ByVal neuTextur As String, ByVal Ordner As String, ByVal Neutral As Boolean)
            ReDim Gebaeudetextur(0)
            ReDim GebaeudetexturMaske(0)
            If Neutral Then
                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Buildings\" + Ordner + "Neutral\" + neuTextur + ".png") Then
                    GebaeudetexturNeutral = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\" + Ordner + "Neutral\" + neuTextur + ".png"))
                Else
                    If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Buildings\CW\Neutral\" + neuTextur + ".png") Then
                        GebaeudetexturNeutral = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\CW\Neutral\" + neuTextur + ".png"))
                    End If
                End If
            ElseIf Not NurNeutral Then
                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Buildings\" + Ordner + neuTextur + ".png") Then
                    Gebaeudetextur(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\" + Ordner + neuTextur + ".png"))
                    GebaeudetexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\" + Ordner + neuTextur + "+Maske.png"))
                Else
                    Gebaeudetextur(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\CW\" + neuTextur + ".png"))
                    GebaeudetexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\CW\" + neuTextur + "+Maske.png"))
                End If
            End If
        End Sub
        Public Sub LoadHQ(ByVal Ordner As String, ByVal Neutral As Boolean, ByVal Spieler() As ObjektSpieler)
            If Neutral Then
                LoadGebaeude("HQ", Ordner, True)
            Else
                If Spieler IsNot Nothing Then
                    For I = 0 To Spieler.Length - 1
                        If Spieler(I).Armee <> "" Then
                            If Not Armee.Contains(GetArmyOutFit(Spieler(I).Armee)) Then
                                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Buildings\" + Ordner + "HQ+" + GetArmyOutFit(Spieler(I).Armee) + ".png") Then
                                    Array.Resize(Gebaeudetextur, Gebaeudetextur.Length + 1)
                                    Array.Resize(GebaeudetexturMaske, GebaeudetexturMaske.Length + 1)
                                    Array.Resize(Armee, Armee.Length + 1)
                                    Gebaeudetextur(Gebaeudetextur.Length - 1) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\" + Ordner + "HQ+" + GetArmyOutFit(Spieler(I).Armee) + ".png"))
                                    GebaeudetexturMaske(Gebaeudetextur.Length - 1) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\" + Ordner + "HQ+" + GetArmyOutFit(Spieler(I).Armee) + "+Maske.png"))
                                    Armee(Armee.Length - 1) = Spieler(I).Armee
                                End If
                            End If
                        End If
                    Next
                Else
                    ReDim Gebaeudetextur(0)
                    ReDim GebaeudetexturMaske(0)
                    ReDim Armee(0)
                    Gebaeudetextur(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\" + Ordner + "HQ+OS.png"))
                    GebaeudetexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\" + Ordner + "HQ+OS+Maske.png"))
                    Armee(0) = Armeen.OS.ToString
                End If
            End If
        End Sub
        Private Sub LoadSpezialGebaeude(ByVal Neutral As Boolean, ByVal neuTextur As String, ByVal Ordner As String)
            If Neutral = True Then
                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Buildings\" + Ordner + "Neutral\" + neuTextur + ".png") Then
                    GebaeudetexturNeutral = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\" + Ordner + "Neutral\" + neuTextur + ".png"))
                Else
                    If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Buildings\CW\Neutral\" + neuTextur + ".png") Then
                        GebaeudetexturNeutral = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\CW\Neutral\" + neuTextur + ".png"))
                    End If
                End If
                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Buildings\" + Ordner + "Symbol\Neutral\" + neuTextur + ".png") Then
                    SymbolTexturNeutral = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\" + Ordner + "Symbol\Neutral\" + neuTextur + ".png"))
                ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Buildings\CW\Symbol\Neutral\" + neuTextur + ".png") Then
                    SymbolTexturNeutral = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\CW\Symbol\Neutral\" + neuTextur + ".png"))
                ElseIf My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Buildings\" + Ordner + "Symbol\" + neuTextur + ".png") Then
                    SymbolTexturNeutral = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\" + Ordner + "Symbol\" + neuTextur + ".png"))
                Else
                    SymbolTexturNeutral = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\CW\Symbol\" + neuTextur + ".png"))
                End If
            ElseIf Not NurNeutral Then
                Array.Resize(Gebaeudetextur, 1)
                Array.Resize(GebaeudetexturMaske, 1)
                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Buildings\" + Ordner + neuTextur + ".png") Then
                    Gebaeudetextur(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\" + Ordner + neuTextur + ".png"))
                    GebaeudetexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\" + Ordner + neuTextur + "+Maske.png"))
                Else
                    Gebaeudetextur(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\CW\" + neuTextur + ".png"))
                    GebaeudetexturMaske(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\CW\" + neuTextur + "+Maske.png"))
                End If
                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Buildings\" + Ordner + "Symbol\" + neuTextur + ".png") Then
                    SymbolTextur = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\" + Ordner + "Symbol\" + neuTextur + ".png"))
                    SymbolTexturMaske = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\" + Ordner + "Symbol\" + neuTextur + "+Maske.png"))
                Else
                    SymbolTextur = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\CW\Symbol\" + neuTextur + ".png"))
                    SymbolTexturMaske = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Buildings\CW\Symbol\" + neuTextur + "+Maske.png"))
                End If
            End If

        End Sub
        Public Shared Sub LoadAlleGebaeude()
            For Each G In AlleGebaeude
                G.Reset()
            Next
            Array.Resize(AlleGebaeude, 40)
            AlleGebaeude(0) = New GebaeudeTextur("MONOLITH", True, "Monolith", False)
            AlleGebaeude(1) = New GebaeudeTextur("ARUURA", True, "Talon Gun", False)
            AlleGebaeude(2) = New GebaeudeTextur("ARUURAZERSTOERT", True, "Talon Gun+Zerstoert", False)
            AlleGebaeude(3) = New GebaeudeTextur("SCHWARZE GESCHUETZ+N", True, "Schwarze Geschuetz+N", False)
            AlleGebaeude(4) = New GebaeudeTextur("SCHWARZE GESCHUETZ+S", True, "Schwarze Geschuetz+S", False)
            AlleGebaeude(5) = New GebaeudeTextur("SCHWARZE GESCHUETZ+W", True, "Schwarze Geschuetz+W", False)
            AlleGebaeude(6) = New GebaeudeTextur("SCHWARZE GESCHUETZ+O", True, "Schwarze Geschuetz+O", False)
            AlleGebaeude(7) = New GebaeudeTextur("FABRIK", True, "Fabrik", False)
            AlleGebaeude(8) = New GebaeudeTextur("SCHOCKLASER+N", True, "Schocklaser+N", False)
            AlleGebaeude(9) = New GebaeudeTextur("SCHOCKLASER+W", True, "Schocklaser+W", False)
            AlleGebaeude(10) = New GebaeudeTextur("SCHOCKLASER+S", True, "Schocklaser+S", False)
            AlleGebaeude(11) = New GebaeudeTextur("SCHOCKLASER+O", True, "Schocklaser+O", False)
            AlleGebaeude(12) = New GebaeudeTextur("OMEGARAKETE", True, "OmegaBasis", False)
            AlleGebaeude(13) = New GebaeudeTextur("FESTUNG", True, "Festung", False)
            AlleGebaeude(14) = New GebaeudeTextur("VULKAN", True, "VULKAN", True)
            AlleGebaeude(15) = New GebaeudeTextur("FLIEGENDEFESTUNG", True, "FliegendeFestung", False)
            AlleGebaeude(16) = New GebaeudeTextur("STADT", False, "STADT", False)
            AlleGebaeude(17) = New GebaeudeTextur("HQ", False, "HQ", False)
            AlleGebaeude(18) = New GebaeudeTextur("BASIS", False, "BASIS", False)
            AlleGebaeude(19) = New GebaeudeTextur("FLUGHAFEN", False, "FLUGHAFEN", False)
            AlleGebaeude(20) = New GebaeudeTextur("KRISTALL", False, "KRISTALL", False)
            AlleGebaeude(21) = New GebaeudeTextur("LASER", False, "LASER", False)
            AlleGebaeude(22) = New GebaeudeTextur("MINIGESCHUETZ+N", False, "MINIGESCHUETZ+N", False)
            AlleGebaeude(23) = New GebaeudeTextur("MINIGESCHUETZ+S", False, "MINIGESCHUETZ+S", False)
            AlleGebaeude(24) = New GebaeudeTextur("MINIGESCHUETZ+W", False, "MINIGESCHUETZ+W", False)
            AlleGebaeude(25) = New GebaeudeTextur("MINIGESCHUETZ+O", False, "MINIGESCHUETZ+O", False)
            AlleGebaeude(26) = New GebaeudeTextur("PIPESTATION", False, "PIPESTATION", False)
            AlleGebaeude(27) = New GebaeudeTextur("RAKETENSILO", False, "RAKETENSILO", True)
            AlleGebaeude(28) = New GebaeudeTextur("RAKETENSILO+RAKETE", False, "RAKETENSILO+RAKETE", True)
            AlleGebaeude(29) = New GebaeudeTextur("TURM", False, "TURM", False)
            AlleGebaeude(30) = New GebaeudeTextur("WERFT", False, "WERFT", False)
            AlleGebaeude(31) = New GebaeudeTextur("MINE", False, "MINE", False)
            AlleGebaeude(32) = New GebaeudeTextur("RADAR", False, "RADAR", False)
            AlleGebaeude(33) = New GebaeudeTextur("TEMPFLUGHAFEN", False, "TEMPFLUGHAFEN", False)
            AlleGebaeude(34) = New GebaeudeTextur("TEMPWERFT", False, "TEMPWERFT", False)
            AlleGebaeude(35) = New GebaeudeTextur("LABOR", False, "LABOR", False)
            AlleGebaeude(36) = New GebaeudeTextur("FLIEGENDESMINIGESCHUETZ+N", False, "FLIEGENDESMINIGESCHUETZ+N", False)
            AlleGebaeude(37) = New GebaeudeTextur("FLIEGENDESMINIGESCHUETZ+S", False, "FLIEGENDESMINIGESCHUETZ+S", False)
            AlleGebaeude(38) = New GebaeudeTextur("FLIEGENDESMINIGESCHUETZ+W", False, "FLIEGENDESMINIGESCHUETZ+W", False)
            AlleGebaeude(39) = New GebaeudeTextur("FLIEGENDESMINIGESCHUETZ+O", False, "FLIEGENDESMINIGESCHUETZ+O", False)
        End Sub
        Public Shared Function GetGebaeudeZahl(ByVal Spieler As Integer) As Integer
            Dim Z As Integer = 0
            If Spieler > 0 Then
                For I = 0 To AlleGebaeude.Length - 1
                    If Not AlleGebaeude(I).SpezialGebaeude Then
                        If Not AlleGebaeude(I).NurNeutral Then
                            Z += 1
                        End If
                    End If
                Next
            Else
                For I = 0 To AlleGebaeude.Length - 1
                    If Not AlleGebaeude(I).SpezialGebaeude Then
                        Z += 1
                    End If
                Next
            End If
            Return Z
        End Function
        Public Shared Function GetSpezialGebaeudeZahl(ByVal Spieler As Integer) As Integer
            Dim Z As Integer = 0
            If Spieler > 0 Then
                For I = 0 To AlleGebaeude.Length - 1
                    If AlleGebaeude(I).SpezialGebaeude Then
                        If Not AlleGebaeude(I).NurNeutral Then
                            Z += 1
                        End If
                    End If
                Next
            Else
                For I = 0 To AlleGebaeude.Length - 1
                    If AlleGebaeude(I).SpezialGebaeude Then
                        Z += 1
                    End If
                Next
            End If
            Return Z
        End Function
        Public Sub DrawGebaeude(ByVal Spieler As Integer, ByVal Armee As String, ByVal intcolor As Color, Optional ByVal sngRotation As Single = 0)
            If Spieler > 0 Then
                Dim I As Integer = 0
                If Gebaeudetextur.Length > 1 Then
                    For I2 = 0 To Me.Armee.Length - 1
                        If Me.Armee(I2) = GetArmyOutFit(Armee) Then
                            I = I2
                            Exit For
                        End If
                    Next
                End If
                Grafikengine.Sprite.Draw2D(Gebaeudetextur(I), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                If intcolor <> Hauptmenue.NeutralFarbe Then
                    intcolor = ObjektmarkiertesFeld.getMischfarbe(intcolor, Spielfeld.Spieler(Spieler).Farbe, 0.5#, False)
                Else
                    intcolor = Spielfeld.Spieler(Spieler).Farbe
                End If
                Grafikengine.Sprite.Draw2D(GebaeudetexturMaske(I), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
            Else
                If GebaeudetexturNeutral IsNot Nothing Then
                    Grafikengine.Sprite.Draw2D(GebaeudetexturNeutral, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                Else
                    Grafikengine.Sprite.Draw2D(Gebaeudetextur(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                    Grafikengine.Sprite.Draw2D(GebaeudetexturMaske(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                End If

            End If
        End Sub
        Public Sub DrawGebaeude(ByVal Spieler As Integer, ByVal Armee As String, ByVal intcolor As Color, ByVal Cube As CustomVertex.PositionTextured(), ByVal Pos As Vector3)
            If Spieler > 0 Then
                Dim I As Integer = 0
                If Gebaeudetextur.Length > 1 Then
                    For I2 = 0 To Me.Armee.Length - 1
                        If Me.Armee(I2) = GetArmyOutFit(Armee) Then
                            I = I2
                            Exit For
                        End If
                    Next
                End If
                Grafikengine.malen2Din3D(Pos, Cube, Gebaeudetextur(I), intcolor)
                If intcolor <> Hauptmenue.NeutralFarbe Then
                    intcolor = ObjektmarkiertesFeld.getMischfarbe(intcolor, Spielfeld.Spieler(Spieler).Farbe, 0.5#, False)
                Else
                    intcolor = Spielfeld.Spieler(Spieler).Farbe
                End If

                Grafikengine.malen2Din3D(Pos, Cube, GebaeudetexturMaske(I), intcolor)
            Else
                If GebaeudetexturNeutral IsNot Nothing Then
                    Grafikengine.malen2Din3D(Pos, Cube, GebaeudetexturNeutral, intcolor)
                Else
                    Grafikengine.malen2Din3D(Pos, Cube, Gebaeudetextur(0), intcolor)
                    Grafikengine.malen2Din3D(Pos, Cube, GebaeudetexturMaske(0), intcolor)
                End If
            End If
        End Sub
        Public Sub DrawSymbol(ByVal Spieler As Integer, ByVal Armee As String, ByVal intcolor As Color, Optional ByVal sngRotation As Single = 0)
            If Spieler > 0 Then
                Dim I As Integer = 0
                If Gebaeudetextur.Length > 1 Then
                    For I2 = 0 To Me.Armee.Length - 1
                        If Me.Armee(I2) = Armee Then
                            I = I2
                            Exit For
                        End If
                    Next
                End If
                Grafikengine.Sprite.Draw2D(SymbolTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                If intcolor <> Hauptmenue.NeutralFarbe Then
                    intcolor = ObjektmarkiertesFeld.getMischfarbe(intcolor, Spielfeld.Spieler(Spieler).Farbe, 0.5#, False)
                Else
                    intcolor = Spielfeld.Spieler(Spieler).Farbe
                End If
                Grafikengine.Sprite.Draw2D(SymbolTexturMaske, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
            Else
                Grafikengine.Sprite.Draw2D(SymbolTexturNeutral, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
            End If
        End Sub
        Public Shared Function GetSpezialGebaeude(ByVal ID As Integer, ByVal Spieler As Integer) As GebaeudeTextur
            Dim Z As Integer = -1
            For I = 0 To AlleGebaeude.Length - 1
                If AlleGebaeude(I).SpezialGebaeude Then
                    If Spieler > 0 Then
                        If Not AlleGebaeude(I).NurNeutral Then
                            Z += 1
                            If Z = ID Then
                                Return AlleGebaeude(I)
                            End If
                        End If
                    Else
                        Z += 1
                        If Z = ID Then
                            Return AlleGebaeude(I)
                        End If
                    End If
                End If
            Next
            Return Nothing
        End Function
        Public Shared Function GetSpezialGebaeudeID(ByVal ID As Integer, ByVal Spieler As Integer) As Integer
            Dim Z As Integer = -1
            For I = 0 To AlleGebaeude.Length - 1
                If AlleGebaeude(I).SpezialGebaeude Then
                    If Spieler > 0 Then
                        If Not AlleGebaeude(I).NurNeutral Then
                            Z += 1
                            If Z = ID Then
                                Return I
                            End If
                        End If
                    Else
                        Z += 1
                        If Z = ID Then
                            Return I
                        End If
                    End If
                End If
            Next
            Return -1
        End Function
        ''' <summary>
        ''' Die ID allerdings nicht die richtige im Array sondern das n-te Spezialgebaeude
        ''' </summary>
        ''' <param name="ID"></param>
        ''' <param name="Spieler"></param>
        ''' <param name="Armee"></param>
        ''' <param name="intcolor"></param>
        ''' <param name="sngRotation"></param>
        ''' <remarks></remarks>
        Public Shared Sub DrawSpezialGebaeude(ByVal ID As Integer, ByVal Spieler As Integer, ByVal Armee As String, ByVal intcolor As Color, Optional ByVal sngRotation As Single = 0)
            Dim Z As Integer = GetSpezialGebaeudeID(ID, Spieler)
            If Z >= 0 Then
                Dim G As GebaeudeTextur = AlleGebaeude(Z)
                If Spieler > 0 Then
                    Dim I As Integer = 0
                    If G.Gebaeudetextur.Length > 1 Then
                        For I2 = 0 To G.Armee.Length - 1
                            If G.Armee(I2) = Armee Then
                                I = I2
                                Exit For
                            End If
                        Next
                    End If
                    Grafikengine.Sprite.Draw2D(G.Gebaeudetextur(I), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                    If intcolor <> Hauptmenue.NeutralFarbe Then
                        intcolor = ObjektmarkiertesFeld.getMischfarbe(intcolor, Spielfeld.Spieler(Spieler).Farbe, 0.5#, False)
                    Else
                        intcolor = Spielfeld.Spieler(Spieler).Farbe
                    End If
                    Grafikengine.Sprite.Draw2D(G.GebaeudetexturMaske(I), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                Else
                    If G.GebaeudetexturNeutral IsNot Nothing Then
                        Grafikengine.Sprite.Draw2D(G.GebaeudetexturNeutral, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                    Else
                        Grafikengine.Sprite.Draw2D(G.Gebaeudetextur(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                        Grafikengine.Sprite.Draw2D(G.GebaeudetexturMaske(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                    End If
                End If
            End If
        End Sub
        ''' <summary>
        ''' Die ID allerdings nicht die richtige im Array sondern das n-te Spezialgebaeude
        ''' </summary>
        ''' <param name="ID"></param>
        ''' <param name="Spieler"></param>
        ''' <param name="Armee"></param>
        ''' <param name="intcolor"></param>
        ''' <param name="sngRotation"></param>
        ''' <remarks></remarks>
        Public Shared Sub DrawSpezialGebaeudeSymbol(ByVal ID As Integer, ByVal Spieler As Integer, ByVal Armee As String, ByVal intcolor As Color, Optional ByVal sngRotation As Single = 0)
            Dim Z As Integer = GetSpezialGebaeudeID(ID, Spieler)
            If Z >= 0 Then
                Dim G As GebaeudeTextur = AlleGebaeude(Z)
                If Spieler > 0 Then
                    Grafikengine.Sprite.Draw2D(G.SymbolTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                    If intcolor <> Hauptmenue.NeutralFarbe Then
                        intcolor = ObjektmarkiertesFeld.getMischfarbe(intcolor, Spielfeld.Spieler(Spieler).Farbe, 0.5#, False)
                    Else
                        intcolor = Spielfeld.Spieler(Spieler).Farbe
                    End If
                    Grafikengine.Sprite.Draw2D(G.SymbolTexturMaske, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                Else
                    If G.GebaeudetexturNeutral IsNot Nothing Then
                        Grafikengine.Sprite.Draw2D(G.SymbolTexturNeutral, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                    Else
                        Grafikengine.Sprite.Draw2D(G.SymbolTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                        Grafikengine.Sprite.Draw2D(G.SymbolTexturMaske, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                    End If

                End If
            End If
        End Sub

        Public Shared Function GetGebaeude(ByVal ID As Integer, ByVal Spieler As Integer) As GebaeudeTextur
            Dim Z As Integer = -1
            For I = 0 To AlleGebaeude.Length - 1
                If Not AlleGebaeude(I).SpezialGebaeude Then
                    If Spieler > 0 Then
                        If Not AlleGebaeude(I).NurNeutral Then
                            Z += 1
                            If Z = ID Then
                                Return AlleGebaeude(I)
                            End If
                        End If
                    Else
                        Z += 1
                        If Z = ID Then
                            Return AlleGebaeude(I)
                        End If
                    End If
                End If
            Next
            Return Nothing
        End Function
        Public Shared Function GetGebaeudeID(ByVal GebaeudeZahl As Integer, ByVal Spieler As Integer) As Integer
            Dim Z As Integer = -1
            For I2 = 0 To Objektverwalter.AlleGebaeude.Length - 1
                If Not Objektverwalter.AlleGebaeude(I2).SpezialGebaeude Then
                    If Spieler > 0 Then
                        If Not Objektverwalter.AlleGebaeude(I2).NurNeutral Then
                            Z += 1
                        End If
                    Else
                        Z += 1
                    End If
                End If
                If Z = GebaeudeZahl Then
                    Return I2
                End If
            Next
            Return -1
        End Function
        Public Shared Sub DrawGebaeude(ByVal ID As Integer, ByVal Spieler As Integer, ByVal Armee As String, ByVal intcolor As Color, Optional ByVal sngRotation As Single = 0)
            Dim Z As Integer = GetGebaeudeID(ID, Spieler)
            If Z >= 0 Then
                Dim G As GebaeudeTextur = AlleGebaeude(Z)
                If Spieler > 0 Then
                    Dim I As Integer = 0
                    If G.Gebaeudetextur.Length > 1 Then
                        For I2 = 0 To G.Armee.Length - 1
                            If G.Armee(I2) = Armee Then
                                I = I2
                                Exit For
                            End If
                        Next
                    End If
                    Grafikengine.Sprite.Draw2D(G.Gebaeudetextur(I), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                    If intcolor <> Hauptmenue.NeutralFarbe Then
                        intcolor = ObjektmarkiertesFeld.getMischfarbe(intcolor, Spielfeld.Spieler(Spieler).Farbe, 0.5#, False)
                    Else
                        intcolor = Spielfeld.Spieler(Spieler).Farbe
                    End If
                    Grafikengine.Sprite.Draw2D(G.GebaeudetexturMaske(I), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                Else
                    If G.GebaeudetexturNeutral IsNot Nothing Then
                        Grafikengine.Sprite.Draw2D(G.GebaeudetexturNeutral, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                    Else
                        Grafikengine.Sprite.Draw2D(G.Gebaeudetextur(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                        Grafikengine.Sprite.Draw2D(G.GebaeudetexturMaske(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intcolor)
                    End If

                End If
            End If
        End Sub

        Public Shared Function GetGebaeudeID(ByVal GebaeudeID As String) As Integer
            For I2 = 0 To Objektverwalter.AlleGebaeude.Length - 1
                If Objektverwalter.AlleGebaeude(I2).GebaeudeID = GebaeudeID Then
                    Return I2
                End If
            Next
            Return -1
        End Function
        Public Shared Function GetNormaleIDAusAllgemeinerID(ByVal ID As Integer, ByVal Spieler As Integer) As Integer
            Dim Z As Integer = -1
            For I = 0 To Objektverwalter.AlleGebaeude.Length - 1
                If Not Objektverwalter.AlleGebaeude(I).SpezialGebaeude Then
                    If Spieler > 0 Then
                        If Not Objektverwalter.AlleGebaeude(I).NurNeutral Then
                            Z += 1
                        End If
                    Else
                        Z += 1
                    End If
                End If
                If ID = I Then
                    Return Z
                End If
            Next
            Return -1
        End Function
        Public Shared Function GetSpezialIDAusAllgemeinerID(ByVal ID As Integer, ByVal Spieler As Integer) As Integer
            Dim Z As Integer = -1
            For I = 0 To Objektverwalter.AlleGebaeude.Length - 1
                If Objektverwalter.AlleGebaeude(I).SpezialGebaeude Then
                    If Spieler > 0 Then
                        If Not Objektverwalter.AlleGebaeude(I).NurNeutral Then
                            Z += 1
                        End If
                    Else
                        Z += 1
                    End If
                End If
                If ID = I Then
                    Return Z
                End If
            Next
            Return -1
        End Function
        Public Sub Reset()
            If SymbolTextur IsNot Nothing Then
                SymbolTextur.Dispose()
                SymbolTextur = Nothing
            End If
            If SymbolTexturMaske IsNot Nothing Then
                SymbolTexturMaske.Dispose()
                SymbolTexturMaske = Nothing
            End If
            If GebaeudetexturNeutral IsNot Nothing Then
                GebaeudetexturNeutral.Dispose()
                GebaeudetexturNeutral = Nothing
            End If
            If SymbolTexturNeutral IsNot Nothing Then
                SymbolTexturNeutral.Dispose()
                SymbolTexturNeutral = Nothing
            End If
            If Gebaeudetextur IsNot Nothing Then
                For i = 0 To Gebaeudetextur.Length - 1
                    If Gebaeudetextur(i) IsNot Nothing Then
                        Gebaeudetextur(i).Dispose()
                        Gebaeudetextur(i) = Nothing
                    End If
                Next
                For I = 0 To GebaeudetexturMaske.Length - 1
                    If GebaeudetexturMaske(I) IsNot Nothing Then
                        GebaeudetexturMaske(I).Dispose()
                        GebaeudetexturMaske(I) = Nothing
                    End If
                Next
            End If
            Grafikengine.Grafikkarte.EvictManagedResources()
        End Sub

    End Structure
#End Region
    Public Shared Sub ArmeeTexturenLaden(ByVal Spieler As ObjektSpieler())
        Dim NowTicks As Long = Now.Ticks
        Dim DauerTicks As Long = 0
        For I = 0 To AlleEinheiten.Length - 1
            If AlleEinheiten(I).ArmeeEinheit < EinheitenTextur.ArmeeEinheiten.Nichts Then
                AlleEinheiten(I).LoadArmeeTexturen(Spieler)

            End If
        Next

        For I = 0 To AlleGebaeude.Length - 1
            If AlleGebaeude(I).GebaeudeID = "HQ" Then
                AlleGebaeude(I).LoadHQ(ObjektLadeklasse.GetOrdner, False, Spieler)
                Exit For
            End If
        Next
        DauerTicks = Now.Ticks
        DataSettings.DurchschnittlicheLadeZeit = (((DauerTicks - NowTicks) / Spieler.Length) + DataSettings.DurchschnittlicheLadeZeit) / 2
        DataSettings.MySettingsIniSave()
    End Sub
#End Region
#End Region
#Region "Objekte"
    Public Shared Menue As ObjektFormMenue = Nothing
    Shared Ladeklasse As ObjektLadeklasse
    Public Shared Minimap As ObjektMinimap
    Public Shared Maus As ObjektMaus
    Public Shared Tabellen As Tabellenverwalter = New Tabellenverwalter()
    Public Shared MarkierteFelder As New Stack(Of ObjektmarkiertesFeld)
    Public Shared EinheitenMenue As ObjektEinheitenmenue
    Public Shared AlleEinheitenLocker As New Mutex
    Public Shared AlleEinheiten() As EinheitenTextur = {}
    Public Shared AlleGebaeude() As GebaeudeTextur = {}
    Public Shared Spielfeld As ObjektSpielfeld = Nothing
#End Region
#End Region
#Region "Objekte erschaffen"
    Public Shared Sub neuMarkiertesFeld(ByVal X As Integer, ByVal Y As Integer, ByVal Farbe As Color, Optional ByVal Bildfarbe As String = "Gruen")
        If Spielfeld.OnMap(X, Y) Then
            If Not Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Hidden Then
                If Objektverwalter.ExistiertMarkiertesFeldschon(X, Y) = False Then
                    MarkierteFelder.Push(New ObjektmarkiertesFeld(X, Y, Farbe, Bildfarbe))
                End If
            End If
        End If
    End Sub
    ''' <summary>
    ''' Damit wird eine Animation die eine Einheit zerstoert abgespielt
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <remarks></remarks>
    Public Shared Sub NeuObjektAnimation(ByVal X As Integer, ByVal Y As Integer, Optional ByVal Musikspielen As Boolean = True)
        NeuObjektAnimation(X, Y, Spielfeld.MomentaneSchlacht, Musikspielen)
    End Sub
    ''' <summary>
    ''' Damit wird eine Animation die eine Einheit zerstoert abgespielt
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <remarks></remarks>
    Public Shared Sub NeuObjektAnimation(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer, Optional ByVal Musikspielen As Boolean = True)
        If Spielfeld.OnMap(X, Y) Then
            If IsNothing(Spielfeld.Einheiten(X, Y, Schlacht)) = False Then
                If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht)) = False Then
                    If Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).Besetzen = True Then
                        Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Gebaeude.Besetzung = ObjektGebaeude.Besetzungszahl
                    End If
                End If
                Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht)
                If E.EinheitenStufe = ObjektEinheit.Stufe.KO Then
                    E.GetSpieler.KOS(0).SetKOEinheit(Nothing)
                End If
                BackbufferSpiel.AddAnimation(Spielfeld.Einheiten(X, Y, Schlacht).Explosion, 0, New Point(X, Y), Musikspielen, Schlacht)
                Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht) = Nothing
            ElseIf IsNothing(Spielfeld.AktuelleEinheit) = False Then
                Dim Explosion As String = Spielfeld.AktuelleEinheit.Explosion
                If IsNothing(Spielfeld.Laufen) Then
                    Spielfeld.Einheiten(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Schlacht) = Spielfeld.AktuelleEinheit
                Else
                    Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Schlacht) = Spielfeld.AktuelleEinheit
                End If
                If Spielfeld.AktuelleEinheit.EinheitenStufe = ObjektEinheit.Stufe.KO Then
                    Spielfeld.AktuelleEinheit.GetSpieler.KOS(0).SetKOEinheit(Nothing)
                End If
                BackbufferSpiel.AddAnimation(Spielfeld.AktuelleEinheit.Explosion, 0, New Point(X, Y), Musikspielen, Schlacht)
                If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht)) = False Then
                    If Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).Besetzen = True Then
                        If Objektverwalter.Spielfeld.Laufen Is Nothing Then
                            Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Gebaeude.Besetzung = ObjektGebaeude.Besetzungszahl
                        Else
                            Objektverwalter.Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Schlacht).Gebaeude.Besetzung = ObjektGebaeude.Besetzungszahl
                        End If
                    End If
                End If
                Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht) = Nothing
                Spielfeld.AktuelleEinheit = Nothing
                Spielfeld.AktuelleEinheitPosition = Nothing
                Spielfeld.Wegsuchsystem = Nothing
                Spielfeld.AktuelleEinheitPfeil = Nothing
                Spielfeld.Laufen.UpdateSichtBereich()
                Spielfeld.LaufenLoeschen = True
            End If
            Spielfeld.Sichterstellen()
        End If
    End Sub
    ''' <summary>
    ''' So wird eine Animation abgespielt
    ''' </summary>
    ''' <param name="Punkt"></param>
    ''' <param name="Explosion"></param>
    ''' <remarks></remarks>
    Public Shared Sub NeuObjektAnimation(ByVal Punkt As Point, ByVal Explosion As String, ByVal Schlacht As Integer, Optional ByVal Musikspielen As Boolean = True)
        If Spielfeld.OnMap(Punkt.X, Punkt.Y) Then
            BackbufferSpiel.AddAnimation(Explosion, 0, Punkt, Musikspielen, Schlacht)
            ZuFeldgehen(Punkt.X, Punkt.Y)
        End If
    End Sub
    ''' <summary>
    ''' So wird ein Pfeil zur Info Anzeige erstellt 
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="Bild"></param>
    ''' <param name="Sound"></param>
    ''' <remarks></remarks>
    Public Shared Sub NeuObjektAnimation(ByVal X As Integer, ByVal Y As Integer, ByVal Bild As String, ByVal Sound As String, Optional ByVal Musikspielen As Boolean = True)
        BackbufferSpiel.AddAnimation(Bild.ToUpper, 0, New Point(X, Y), Musikspielen, Objektverwalter.Spielfeld.MomentaneSchlacht)
    End Sub
#End Region

#Region "Malen"
    Public Shared Sub LoadHintergrund(ByVal Bildpfad As String)
        texturHintergrungBild = Grafikengine.LoadTexture(Bildpfad)
    End Sub
    Public Shared Sub LoadVordergrund(ByVal Bildpfad As String)
        texturVordergrundBild = Grafikengine.LoadTexture(Bildpfad)
    End Sub
    Public Shared Sub VorHinBildmalen(ByVal Bild As Texture, Optional ByVal Draw2d As Boolean = True)
        If DataSettings.draw3D And Not Draw2d Then
            'Kein Hintergrund
        ElseIf DataSettings._2D_3D_Malen And Not Draw2d Then
            Grafikengine.Sprite.End()
            Grafikengine.malen2Din3D(New Vector3, Grafikengine.BackgroundVertex, Bild, Color.White)
            Grafikengine.Sprite.Begin(SpriteFlags.AlphaBlend)
        Else
            Dim sngRotation As Double = 0
            Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
            'pruefen ob wir aus den Screenbereich laufen


            'Festlegen welchen Bereich vom Bitmap wir kopieren

            'Welcher Teil der Textur soll gemalt werden Nichts bedeutet gesamtes Bild
            If DataSettings.Verhaeltnis = Hauptmenue.Breitbild Then
                With Grafikengine.recBild
                    .X = 0 : .Width = 1280
                    .Y = 0 : .Height = 800
                End With
            Else
                With Grafikengine.recBild
                    .X = 0 : .Width = 800
                    .Y = 0 : .Height = 600
                End With
            End If

            'Achtung Rotationszentrum ist auch Ausgangspunkt der bemalung
            With Grafikengine.ptfRotCenter
                .X = 0
                .Y = 0
            End With
            'Ausschnitte in den Backbuffer zeichnen
            'Wo wird das Bild gezeichnet
            Grafikengine.ptfPosition = New Drawing.Point(0, 0)
            '... und wie breit ist es
            With Grafikengine.szfScale
                .Height = DataSettings.BildschirmHoehe
                .Width = DataSettings.BildschirmBreite
            End With
            'jetzt wird es in den Backbuffer gezeichnet
            Grafikengine.Sprite.Draw2D(Bild, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        End If
    End Sub
    Public Shared Function Malen() As Boolean
        If Not texturHintergrungBild = Nothing Then
            If Spielfeld Is Nothing Then
                VorHinBildmalen(texturHintergrungBild)
            Else
                VorHinBildmalen(texturHintergrungBild, False)
            End If
        End If

        If IsNothing(Spielfeld) = False Then
            Spielfeld.Malen()
        End If
        If IsNothing(Minimap) = False Then
            Minimap.Malen()
        End If
        If Not Menue Is Nothing Then Menue.Malen()
        If ObjekteMalen() = False Then
            Return False
        End If


        If MessageBox.MessageDialogueBox IsNot Nothing Then
            MessageBox.Draw()
        End If

        If Not texturVordergrundBild = Nothing Then
            VorHinBildmalen(texturVordergrundBild)
        End If
        'Zuletzt wird die Maus gemalt
        ObjektMaus.Malen()
        'Draw the Tooltip
        If ToolTips IsNot Nothing Then
            ToolTips.Malen()
        End If
        Return True
    End Function
    Private Shared Function ObjekteMalen() As Boolean
        If IsNothing(EinheitenMenue) = False Then
            If EinheitenMenue.Malen() = False Then
                Return False
            End If
        End If
        Return True
    End Function
#End Region


    Public Shared Sub ZuFeldgehen(ByVal XinFeldern As Integer, ByVal YinFeldern As Integer)
        If Spielfeld IsNot Nothing Then
            If DataSettings.draw3D Then
                Dim KameraZiel As New Vector3(XinFeldern, Spielfeld.KameraTarget.Y, -YinFeldern)
                Spielfeld.KameraTarget = KameraZiel
            ElseIf DataSettings._2D_3D_Malen Then
                If Fits3DMapOnScreen() Then
                    Zentrieren()
                Else
                    If Is3DPointOnScreen(XinFeldern, YinFeldern) = False Then
                        Dim KameraZiel As New Vector3(XinFeldern, Spielfeld.KameraTarget.Y, -YinFeldern)
                        Spielfeld.KameraTarget = KameraZiel
                        Spielfeld.KameraPosBerechnen()
                    End If
                End If
            Else
                Dim Punkt As New Point(XinFeldern * Hauptmenue.Feldbreite, YinFeldern * Hauptmenue.Feldbreite)
                If Punkt.X - Hauptmenue.Feldbreite / 2 < Hauptmenue.Rechteck.X + Spielfeld.BildschirmKooX And Punkt.X + Hauptmenue.Feldbreite / 2 > Spielfeld.BildschirmKooX + Hauptmenue.Rechteck.X + Hauptmenue.Rechteck.Width Then
                    Spielfeld.BildschirmKooX = -(XinFeldern * Hauptmenue.Feldbreite - Hauptmenue.Rechteck.Width / 2 - Hauptmenue.Rechteck.X)
                End If
                If Punkt.Y - Hauptmenue.Feldbreite / 2 < Hauptmenue.Rechteck.Y + Spielfeld.BildschirmKooY And Punkt.Y + Hauptmenue.Feldbreite / 2 > Spielfeld.BildschirmKooY + Hauptmenue.Rechteck.Y + Hauptmenue.Rechteck.Height Then
                    Spielfeld.BildschirmKooY = -(YinFeldern * Hauptmenue.Feldbreite - Hauptmenue.Rechteck.Height / 2 - Hauptmenue.Rechteck.Y)
                End If
                If Objektverwalter.Spielfeld.CurrentAI Is Nothing Then
                    Select Case Hauptmenue.Formmodus
                        Case Hauptmenue.Formmodi.Spiel
                            VomRandEntfernen(False)
                        Case Else
                            VomRandEntfernen(True)
                    End Select

                Else
                    VomRandEntfernen(True)
                End If
            End If
        End If
    End Sub
    Public Shared Function Fits3DMapOnScreen() As Boolean
        If Is3DPointOnScreen(0, 0) Then 'Left Upper
            If Is3DPointOnScreen(0, Spielfeld.Hoehe - 1) Then 'Left Lower
                If Is3DPointOnScreen(Spielfeld.Breite - 1, 0) Then 'Right Upper
                    If Is3DPointOnScreen(Spielfeld.Breite - 1, Spielfeld.Hoehe - 1) Then 'Right Lower
                        Return True
                    End If
                End If
            End If
        End If
        Return False
    End Function
    Public Shared Function Is3DPointOnScreen(ByVal X As Integer, ByVal Y As Integer) As Boolean
        Dim P1 As Point = Grafikengine.WorldSpaceToScreenSpace(New Vector3(X, ObjektSpielfeld.GetLayerHoehe(ObjektSpielfeld.SpielfeldLayer.Landschaften, Y), -Y + 1)) 'Left Lower
        If P1.X >= Hauptmenue.Feldbreite And P1.Y >= Hauptmenue.Feldbreite Then
            If P1.X < DataSettings.BildschirmBreite - Hauptmenue.Feldbreite And P1.Y < DataSettings.BildschirmHoehe - Hauptmenue.Feldbreite Then
                P1 = Grafikengine.WorldSpaceToScreenSpace(New Vector3(X, ObjektSpielfeld.GetLayerHoehe(ObjektSpielfeld.SpielfeldLayer.Landschaften, Y), -Y)) 'Left lower
                If P1.X >= Hauptmenue.Feldbreite And P1.Y >= Hauptmenue.Feldbreite Then
                    If P1.X < DataSettings.BildschirmBreite - Hauptmenue.Feldbreite And P1.Y < DataSettings.BildschirmHoehe - Hauptmenue.Feldbreite Then
                        P1 = Grafikengine.WorldSpaceToScreenSpace(New Vector3(X + 1, ObjektSpielfeld.GetLayerHoehe(ObjektSpielfeld.SpielfeldLayer.Landschaften, Y), -Y)) 'Right lower
                        If P1.X >= Hauptmenue.Feldbreite And P1.Y >= Hauptmenue.Feldbreite Then
                            If P1.X < DataSettings.BildschirmBreite - Hauptmenue.Feldbreite And P1.Y < DataSettings.BildschirmHoehe - Hauptmenue.Feldbreite Then
                                P1 = Grafikengine.WorldSpaceToScreenSpace(New Vector3(X + 1, ObjektSpielfeld.GetLayerHoehe(ObjektSpielfeld.SpielfeldLayer.Landschaften, Y), -Y + 1)) 'Right Lower
                                If P1.X >= Hauptmenue.Feldbreite And P1.Y >= Hauptmenue.Feldbreite Then
                                    If P1.X < DataSettings.BildschirmBreite - Hauptmenue.Feldbreite And P1.Y < DataSettings.BildschirmHoehe - Hauptmenue.Feldbreite Then
                                        Return True
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
            End If
        End If
        Return False
    End Function
    Public Shared Sub VomRandEntfernen(ByVal MitZentrieren As Boolean)
        If MitZentrieren Then
            If Hauptmenue.Rechteck.Y + Hauptmenue.Feldbreite / 2 < Spielfeld.BildschirmKooY Then
                Spielfeld.BildschirmKooY = Hauptmenue.Rechteck.Y + Hauptmenue.Feldbreite
            ElseIf (Spielfeld.Hoehe + 1) * Hauptmenue.Feldbreite * -1 + DataSettings.BildschirmHoehe - (DataSettings.BildschirmHoehe - Hauptmenue.Rechteck.Height) + Hauptmenue.Feldbreite / 2 + Hauptmenue.Rechteck.Y > Spielfeld.BildschirmKooY Then
                Spielfeld.BildschirmKooY = (Spielfeld.Hoehe + 1) * Hauptmenue.Feldbreite * -1 + DataSettings.BildschirmHoehe - (DataSettings.BildschirmHoehe - Hauptmenue.Rechteck.Height) + Hauptmenue.Feldbreite + Hauptmenue.Rechteck.Y
            End If
            If Hauptmenue.Rechteck.X + Hauptmenue.Feldbreite / 2 < Spielfeld.BildschirmKooX Then
                Spielfeld.BildschirmKooX = Hauptmenue.Rechteck.X + Hauptmenue.Feldbreite
            ElseIf (Spielfeld.Breite + 1) * (Hauptmenue.Feldbreite) * -1 + DataSettings.BildschirmBreite - (DataSettings.BildschirmBreite - Hauptmenue.Rechteck.Width) + Hauptmenue.Feldbreite / 2 + Hauptmenue.Rechteck.X > Spielfeld.BildschirmKooX Then
                Spielfeld.BildschirmKooX = (Spielfeld.Breite + 1) * (Hauptmenue.Feldbreite) * -1 + DataSettings.BildschirmBreite - (DataSettings.BildschirmBreite - Hauptmenue.Rechteck.Width) + Hauptmenue.Feldbreite + Hauptmenue.Rechteck.X
            End If
            Zentrieren()
        End If
    End Sub
    Public Shared Sub Zentrieren()
        If DataSettings._2D_3D_Malen Or DataSettings.draw3D Then
            Spielfeld.CenterCamera()
        Else
            If Not Spielfeld Is Nothing Then
                If DataSettings.AutoresizeWindow And DataSettings.Fenstermodus And TypeOf Objektverwalter.Menue Is ObjektSpielMenue Then
                    Spielfeld.BildschirmKooX = Hauptmenue.Feldbreite / 2
                    Spielfeld.BildschirmKooY = Hauptmenue.Feldbreite / 2
                Else
                    If Hauptmenue.Feldbreite * Spielfeld.Hoehe < Hauptmenue.Rechteck.Height Then
                        Spielfeld.BildschirmKooY = (Hauptmenue.Rechteck.Height - Hauptmenue.Feldbreite * Spielfeld.Hoehe) / 2 + Hauptmenue.Rechteck.Y
                    End If
                    If Hauptmenue.Feldbreite * Spielfeld.Breite < Hauptmenue.Rechteck.Width Then
                        Spielfeld.BildschirmKooX = (Hauptmenue.Rechteck.Width - Hauptmenue.Feldbreite * Spielfeld.Breite) / 2 + Hauptmenue.Rechteck.X
                    End If
                End If
            End If
        End If
    End Sub
    Public Shared Sub Reset(ByVal SpielfeldNichtloeschen As Boolean)
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            Spielfeld.BildschirmKooX = 0
            Spielfeld.BildschirmKooY = 0
        End If
        If texturHintergrungBild IsNot Nothing Then
            texturHintergrungBild.Dispose()
            texturHintergrungBild = Nothing
        End If
        If texturVordergrundBild IsNot Nothing Then
            texturVordergrundBild.Dispose()
            texturVordergrundBild = Nothing
        End If
        If SpielfeldNichtloeschen = False Then
            Spielfeld = Nothing
        End If
        If Objektverwalter.EinheitenMenue IsNot Nothing Then
            Objektverwalter.EinheitenMenue.Dispose()
        End If
        EinheitenMenue = Nothing
        If Objektverwalter.Minimap IsNot Nothing Then
            Objektverwalter.Minimap.Reset()
            Minimap = Nothing
        End If
        ToolTips = Nothing
        BackbufferSpiel.DeleteAllAnimations()
        MarkierteFelder.Clear()
        Grafikengine.Grafikkarte.EvictManagedResources()
    End Sub
#Region "Initialisierung"
    Public Shared Sub IniVerwalter()
        Konsole.Write("Setup Objects...")
        Ladeklasse = New ObjektLadeklasse
        ABCBild = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Fonts\ABC.png")
        If DataSettings.draw3D Then ObjektLadeklasse.Load3D()
        Pfeileladen()
        'Die Spieltexturen laden!
        Konsole.Write("Setup Textures...")
        LoadNewGameModus(DataSettings.TerrainStyle - 1)
        ObjektKOInformation.LoadTextur()
        Dim G As New KampfGrafiken
    End Sub

    Public Shared Sub Pfeileladen()
        Array.Resize(Pfeile, 4)
        Dim Bild As Image = Image.FromFile(DataSettings.Resourcenpfad + "Pfeile\Pfeil+L.png")
        Pfeile(0) = Grafikengine.LoadTexture(Bild)
        Bild.RotateFlip(RotateFlipType.RotateNoneFlipX)
        Pfeile(1) = Grafikengine.LoadTexture(Bild)
        Bild = Image.FromFile(DataSettings.Resourcenpfad + "Pfeile\Pfeil+O.png")
        Pfeile(2) = Grafikengine.LoadTexture(Bild)
        Bild.RotateFlip(RotateFlipType.RotateNoneFlipY)
        Pfeile(3) = Grafikengine.LoadTexture(Bild)

    End Sub
    Public Shared Sub Symbolfunktionenladen()
        Array.Resize(Symbole, 0)
        Array.Resize(Symbolfunktion, 0)
        If Hauptmenue.ZoomedIn Then
            For Each Symbol In My.Computer.FileSystem.GetFiles(DataSettings.Resourcenpfad + "Units\Symbols\Zoomed In\", FileIO.SearchOption.SearchTopLevelOnly, "*.png")
                Array.Resize(Symbole, Symbole.Length + 1)
                Array.Resize(Symbolfunktion, Symbole.Length)
                Symbole(Symbole.Length - 1) = Grafikengine.LoadTexture(Symbol)
                Dim Name As String = Symbol.Remove(0, Symbol.LastIndexOf("\") + 1)
                Name = Name.Remove(Name.LastIndexOf("."))
                Symbolfunktion(Symbolfunktion.Length - 1) = Name
            Next
        Else
            For Each Symbol In My.Computer.FileSystem.GetFiles(DataSettings.Resourcenpfad + "Units\Symbols\Zoomed Out\", FileIO.SearchOption.SearchTopLevelOnly, "*.png")
                Array.Resize(Symbole, Symbole.Length + 1)
                Array.Resize(Symbolfunktion, Symbole.Length)
                Symbole(Symbole.Length - 1) = Grafikengine.LoadTexture(Symbol)
                Dim Name As String = Symbol.Remove(0, Symbol.LastIndexOf("\") + 1)
                Name = Name.Remove(Name.LastIndexOf("."))
                Symbolfunktion(Symbolfunktion.Length - 1) = Name
            Next
        End If
    End Sub

    Public Shared Sub LoadNewGameModus(ByVal OldModus As Integer)
        If OldModus <> DataSettings.TerrainStyle Then
            LoadNewGameModus(True)
        Else
            LoadNewGameModus(False)
        End If
    End Sub
    Public Shared Sub LoadNewGameModus(ByVal ReloadTerrain As Boolean)
        If ReloadTerrain Then
            If DataSettings.TerrainStyle = TerrainStyle.CommanderWars2 Then
                LoadZoom(True)
            Else
                LoadZoom(False)
            End If
            Select Case DataSettings.TerrainStyle
                Case TerrainStyle.CommanderWars2, TerrainStyle.AdvanceWarsDC
                    'ein Frame mehr!
                    ObjektLandschaft.MaxFrames = 4
                    ObjektLandschaft.HochZaehlen = 1
                Case Else
                    ObjektLandschaft.MaxFrames = 3
                    ObjektLandschaft.HochZaehlen = 0
            End Select
            ObjektLadeklasse.LandschaftsTexturenladen()
            TexturenHalter.LoadModusTexturen()
        End If
        Objektverwalter.Tabellen = New Tabellenverwalter()
        'So dann laeuft alles wie es soll.
        ObjektLadeklasse.AlleEinheitenLaden()
        Objektverwalter.GebaeudeTextur.LoadAlleGebaeude()

        KOTexturenLaden()

    End Sub
    ''' <summary>
    ''' Erstellt die Engine so, dass wir 24 x 24 Bilder nutzen koennen oder 16 x 16
    ''' </summary>
    ''' <remarks></remarks>
    Private Shared Sub LoadZoom(ByVal ZoomedIn As Boolean)
        If ZoomedIn Then
            Hauptmenue.Feldbreite = Hauptmenue.FeldbreiteGross
            Hauptmenue.ZoomedIn = True
            'So jetzt der Ini Teil
            ObjektMaus.CursorLaden()
            ObjektmarkiertesFeld.DeleteTexturen()
            ObjektAnimation.DeleteAnimationsTexturen()
            Symbolfunktionenladen()

        Else
            Hauptmenue.Feldbreite = Hauptmenue.FeldbreiteKlein
            Hauptmenue.ZoomedIn = False
            'So jetzt der Ini Teil
            ObjektMaus.CursorLaden()
            ObjektmarkiertesFeld.DeleteTexturen()
            ObjektAnimation.DeleteAnimationsTexturen()
            Symbolfunktionenladen()

        End If
        'Neue Werte durch andere Feldbreite allgemein gueltig
        ObjektLandschaft.UebergangsBreite = Hauptmenue.Feldbreite * 5 / 2
    End Sub
#End Region
    Public Shared Function Bewegungskosten(ByVal Einheit As ObjektEinheit, ByVal Landschaft As String, ByVal Wetter As ObjektSpielfeld.Wetterarten, ByVal X As Integer, ByVal Y As Integer) As Integer
        If Einheit.Spieler = 0 Then
            Return 1
        Else
            If Not Objektverwalter.Spielfeld.Landschaften(X, Y, Einheit.GetMap).Hidden Then
                'If the Game is a normalized Game we need to get the normalized ID.
                Landschaft = Objektverwalter.Spielfeld.GetTerrainID(Landschaft)

                Landschaft = Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).GetLandschaft(Landschaft)

                'Schiffe koennen in manchen Spielvarianten nur ueber eigen bzw. Verbuendete Haefen fahren.
                If Einheit.Bewegungsart = MovementSorts.Schiff.ToString Then
                    Dim L As ObjektLandschaft = Objektverwalter.Spielfeld.Landschaften(X, Y, Einheit.GetMap)
                    If L.Gebaeude IsNot Nothing Then
                        If L.Gebaeude.GebaeudeID = "WERFT" Or L.Gebaeude.GebaeudeID = "TEMPWERFT" Then
                            Select Case Objektverwalter.Spielfeld.GetCommanderWarsModus
                                Case CommanderWarsGameModi.AdvanceWarsDC, CommanderWarsGameModi.CommanderWars2
                                    If L.Gebaeude.GetSpieler.Team <> Einheit.GetSpieler.Team Then
                                        Return -1
                                    End If
                            End Select
                        End If
                    End If
                End If
                Dim I As Integer = Array.IndexOf(Spielfeld.Spieler(Einheit.Spieler).KOS(0).Bewegunssenker, Wetter)
                Dim Bewegungspunkte As Integer = Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).VeraenderteWerte.Bewegungskosten
                Dim BAenderung As Integer = -1
                If I >= 0 Then
                    If Spielfeld.Spieler(Einheit.Spieler).KOS(0).Bewegungswetter(I) = ObjektKO.Bewegungsarten.Eins Then
                        If Tabellenverwalter.GetWert(Einheit.Bewegungsart + "+" + Wetter.ToString, Landschaft) > 0 Then
                            Bewegungspunkte += 1
                        Else
                            Bewegungspunkte = -1
                        End If
                    Else
                        BAenderung = Tabellenverwalter.GetWert(Einheit.Bewegungsart + "+" + Spielfeld.Spieler(Einheit.Spieler).KOS(0).Bewegungswetter(I).ToString, Landschaft)
                        If BAenderung < 0 Then
                            Return -1
                        Else
                            Bewegungspunkte += BAenderung
                        End If
                    End If
                Else
                    BAenderung = Tabellenverwalter.GetWert(Einheit.Bewegungsart + "+" + Wetter.ToString, Landschaft)
                    If BAenderung < 0 Then
                        Return -1
                    Else
                        Bewegungspunkte += BAenderung
                    End If
                End If
                'Manche KOs haben auf gewissen Landschaften feste Bewegungskosten.
                If Bewegungspunkte > 0 Then
                    Dim Stelle As Integer = FindElement(Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).BewegungskostenUntergrund, Landschaft)
                    If Stelle >= 0 Then
                        Bewegungspunkte = Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).NeueBewegungskosten(Stelle)
                    End If
                    'Manche KOs setzen die Bewegungspunkte auf manchen Feldern fest
                    For Each Feld In Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).VeraenderteWerte.VeraenderteBewegungsFelder
                        If Feld.X = X And Feld.Y = Y Then
                            Bewegungspunkte = Feld.Z
                        End If
                    Next
                End If
                Return Bewegungspunkte
            Else
                Return -1
            End If
        End If
    End Function
    ''' <summary>
    ''' Gibt an ob die Einheit auf dieses Feld plaziert werden kann 
    ''' </summary>
    ''' <param name="Bewegungsart"></param>
    ''' <param name="Landschaft"></param>
    ''' <param name="Wetter"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function Bewegungskosten(ByVal Bewegungsart As String, ByVal Landschaft As String, ByVal Wetter As ObjektSpielfeld.Wetterarten) As Integer
        Return Tabellenverwalter.GetWert(Bewegungsart + "+" + Wetter.ToString, Landschaft)
    End Function
    ''' <summary>
    ''' Wenn auf diesem Feld eine Einheit ist wird sie ausgewaehlt
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <remarks></remarks>
    Public Shared Function ExistiertMarkiertesFeldschon(ByVal X As Integer, ByVal Y As Integer) As Boolean
        For I = 0 To MarkierteFelder.Count - 1
            If MarkierteFelder(I).X = X And MarkierteFelder(I).Y = Y Then
                Return True
            End If
        Next
        Return False
    End Function
#Region "Einheiten Befehle"
#Region "Menue erschaffen"
    Public Shared Sub addMenueitem(ByVal Name As String, ByVal Symbol As Texture, ByRef Symbole As Stack(Of Texture), ByRef Namen As Stack(Of String), Optional ByVal Enabled As Boolean = False, Optional ByRef Enables As Stack(Of Boolean) = Nothing, Optional ByVal NeuSymbolMaske As Texture = Nothing, Optional ByRef SymbolMasken As Stack(Of Texture) = Nothing)
        Namen.Push(Name)
        Symbole.Push(Symbol)
        If Not Enables Is Nothing Then
            Enables.Push(Enabled)
        End If
        If SymbolMasken IsNot Nothing Then
            SymbolMasken.Push(NeuSymbolMaske)
        End If
    End Sub
#Region "Befehlsmenue"
    Public Shared Sub Befehlsmenuerschaffen()
        Dim Symbolen As New Stack(Of Texture)
        Dim Namen As New Stack(Of String)
        Dim SymbolMasken As New Stack(Of Texture)
        Dim NichtBewegt As Boolean = IsNothing(Spielfeld.Laufen)
        Dim FeldBesetzt As Boolean = False
        If NichtBewegt = False Then
            FeldBesetzt = IsNothing(Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht))
        End If
        If NichtBewegt = False Then
            If FeldBesetzt = False Then

                If KannGeladenwerden(Spielfeld.AktuelleEinheit, Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht)) = True Then
                    Namen.Push("Fracht")
                    Symbolen.Push(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Transport.png"))
                End If

                If KannEinen() = True Then
                    Namen.Push("Einen")
                    Symbolen.Push(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Einen.png"))
                End If

                If Spielfeld.AktuelleEinheit.Bewegungsart = MovementSorts.Hoellium.ToString Then
                    Namen.Push("Warten")
                    Symbolen.Push(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Warten.png"))
                End If

            Else
                'Die Einheit hat sich bewegt

                If KannBesetzen(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y) Then
                    Namen.Push("Besetzen")
                    Symbolen.Push(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Besetzen.png"))
                    SymbolMasken.Push(Nothing)
                End If

                If CanBuildTempBase() Then
                    Namen.Push("Basis bauen")
                    Symbolen.Push(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Besetzen.png"))
                    SymbolMasken.Push(Nothing)
                End If

                If KannAngreifen(Spielfeld.AktuelleEinheit, NichtBewegt) = True Then
                    Namen.Push("Feuer")
                    Symbolen.Push(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Feuer.png"))
                    SymbolMasken.Push(Nothing)
                End If


                If KannRaketeZuenden() Then
                    Namen.Push("Zuenden")
                    Symbolen.Push(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Feuer.png"))
                    SymbolMasken.Push(Nothing)
                End If

                If KannEntladen() Then

                    For Each Einheit In Spielfeld.AktuelleEinheit.Ladung
                        If IsNothing(Einheit) = False Then
                            If KannEntladen(Einheit, Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y) Then
                                Dim ID As Integer = 0
                                For I = 0 To Objektverwalter.AlleEinheiten.Length - 1
                                    If AlleEinheiten(I).EinheitenID = Einheit.EinheitenID Then
                                        ID = I
                                        Exit For
                                    End If
                                Next

                                Dim Symbol As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentextur(Spielfeld.AktuellerSpieler.Armee)
                                Dim Maske As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentexturMaske(Spielfeld.AktuellerSpieler.Armee)
                                Namen.Push(Einheit.Einheitenname)
                                Symbolen.Push(Symbol)
                                SymbolMasken.Push(Maske)
                            End If
                        End If
                    Next
                End If

                If Spielfeld.AktuelleEinheit.KannTarnen = True Then
                    If Spielfeld.AktuelleEinheit.IsGetaucht = True Then
                        Namen.Push("Auftauchen")
                        Symbolen.Push(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Tauchen.png"))
                        SymbolMasken.Push(Nothing)
                    Else
                        Namen.Push("Tarnen")
                        Symbolen.Push(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Tauchen.png"))
                        SymbolMasken.Push(Nothing)
                    End If
                End If
                Dim F As String() = Spielfeld.AktuelleEinheit.Faehigkeit.ToLower.Split("+")
                For I = 0 To F.Length - 1
                    Select Case F(I)
                        Case "ration", "rationsame"
                            If KannRation() Then
                                Namen.Push("Ration")
                                Symbolen.Push(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Ration.png"))
                                SymbolMasken.Push(Nothing)
                            End If
                        Case "reparieren"
                            If KannRation() Then
                                Namen.Push("Reparieren")
                                Symbolen.Push(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Heilen.png"))
                                SymbolMasken.Push(Nothing)
                            End If
                        Case "explosion"
                            Namen.Push("Explosion")
                            Symbolen.Push(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Feuer.png"))
                            SymbolMasken.Push(Nothing)
                        Case "truppenbau"
                            If DataSettings.CommanderWarsGameModus = CommanderWarsGameModi.AdvanceWarsDC Then
                                If Objektverwalter.Spielfeld.AktuelleEinheit.Munition > 0 Then
                                    If Objektverwalter.Spielfeld.AktuelleEinheit.HasPlaceforLoading Then
                                        Namen.Push("Truppenbau")
                                        Symbolen.Push(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Omega-Bau.png"))
                                        SymbolMasken.Push(Nothing)
                                    End If
                                End If
                            Else
                                Namen.Push("Truppenbau")
                                Symbolen.Push(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Omega-Bau.png"))
                                SymbolMasken.Push(Nothing)
                            End If
                        Case "bauen"
                            Namen.Push("Bauen")
                            Symbolen.Push(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Omega-Bau.png"))
                            SymbolMasken.Push(Nothing)
                        Case "feuerrakete"
                            Namen.Push("Feuerrakete")
                            Symbolen.Push(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Feuer.png"))
                            SymbolMasken.Push(Nothing)
                        Case "moveandfire"
                            If KannAngreifen(Spielfeld.AktuelleEinheit, True) = True Then
                                If Namen.Contains("Feuer") = False Then
                                    Namen.Push("Feuer")
                                    Symbolen.Push(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Feuer.png"))
                                    SymbolMasken.Push(Nothing)
                                End If
                            End If
                        Case "truppenbau+moveandfire"
                            If KannAngreifen(Spielfeld.AktuelleEinheit, True) = True Then
                                If Namen.Contains("Feuer") = False Then
                                    Namen.Push("Feuer")
                                    Symbolen.Push(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Feuer.png"))
                                    SymbolMasken.Push(Nothing)
                                End If
                            End If
                            If DataSettings.CommanderWarsGameModus = CommanderWarsGameModi.AdvanceWarsDC Then
                                If Objektverwalter.Spielfeld.AktuelleEinheit.Munition > 0 Then
                                    If Objektverwalter.Spielfeld.AktuelleEinheit.HasPlaceforLoading Then
                                        Namen.Push("Truppenbau")
                                        Symbolen.Push(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Omega-Bau.png"))
                                        SymbolMasken.Push(Nothing)
                                    End If
                                End If
                            Else
                                addMenueitem("Truppenbau", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Omega-Bau.png"), Symbolen, Namen, , , , SymbolMasken)
                            End If
                        Case "bauen+ration"
                            addMenueitem("Bauen", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Omega-Bau.png"), Symbolen, Namen, , , , SymbolMasken)
                            If KannRation() Then
                                addMenueitem("Ration", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Ration.png"), Symbolen, Namen, , , , SymbolMasken)
                            End If
                    End Select
                Next
                If KannZuKOAufwerten() Then
                    addMenueitem("KO Einheit", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Warten.png"), Symbolen, Namen, , , , SymbolMasken)
                End If

                addMenueitem("Warten", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Warten.png"), Symbolen, Namen, , , , SymbolMasken)

                If KannSchicken() Then
                    Namen.Push("Einheit schicken")
                    Symbolen.Push(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Einheit schicken.png"))
                    SymbolMasken.Push(Nothing)
                End If

            End If
        Else
            'Die Einheit hat sich nicht bewegt

            If KannBesetzen(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y) Then
                addMenueitem("Besetzen", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Besetzen.png"), Symbolen, Namen, , , , SymbolMasken)
            End If

            If CanBuildTempBase() Then
                addMenueitem("Basis bauen", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Besetzen.png"), Symbolen, Namen, , , , SymbolMasken)
            End If

            If KannAngreifen(Spielfeld.AktuelleEinheit, NichtBewegt) = True Then
                addMenueitem("Feuer", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Feuer.png"), Symbolen, Namen, , , , SymbolMasken)
            End If



            If KannRaketeZuenden() Then
                addMenueitem("Zuenden", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Feuer.png"), Symbolen, Namen, , , , SymbolMasken)
            End If

            If KannEntladen() Then
                For Each Einheit In Spielfeld.AktuelleEinheit.Ladung
                    If IsNothing(Einheit) = False Then
                        If KannEntladen(Einheit, Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y) Then
                            Dim ID As Integer = 0
                            For I = 0 To Objektverwalter.AlleEinheiten.Length - 1
                                If AlleEinheiten(I).EinheitenID = Einheit.EinheitenID Then
                                    ID = I
                                    Exit For
                                End If
                            Next
                            Dim Symbol As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentextur(Spielfeld.AktuellerSpieler.Armee)
                            Dim Maske As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentexturMaske(Spielfeld.AktuellerSpieler.Armee)
                            addMenueitem(Einheit.Einheitenname, Symbol, Symbolen, Namen, , , Maske, SymbolMasken)
                        End If
                    End If
                Next
            End If

            If Spielfeld.AktuelleEinheit.KannTarnen = True Then
                If Spielfeld.AktuelleEinheit.IsGetaucht = True Then
                    addMenueitem("Auftauchen", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Auftauchen.png"), Symbolen, Namen, , , , SymbolMasken)
                Else
                    addMenueitem("Tarnen", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Tauchen.png"), Symbolen, Namen, , , , SymbolMasken)
                End If
            End If

            Dim F As String() = Spielfeld.AktuelleEinheit.Faehigkeit.ToLower.Split("+")
            For I = 0 To F.Length - 1
                Select Case F(I)
                    Case "ration"
                        If KannRation() Then
                            addMenueitem("Ration", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Ration.png"), Symbolen, Namen, , , , SymbolMasken)
                        End If
                    Case "reparieren"
                        If KannRation() Then
                            addMenueitem("Reparieren", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Heilen.png"), Symbolen, Namen, , , , SymbolMasken)
                        End If
                    Case "explosion"
                        addMenueitem("Explosion", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Feuer.png"), Symbolen, Namen, , , , SymbolMasken)
                    Case "truppenbau"
                        If DataSettings.CommanderWarsGameModus = CommanderWarsGameModi.AdvanceWarsDC Then
                            If Objektverwalter.Spielfeld.AktuelleEinheit.Munition > 0 Then
                                If Objektverwalter.Spielfeld.AktuelleEinheit.HasPlaceforLoading Then
                                    addMenueitem("Truppenbau", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Omega-Bau.png"), Symbolen, Namen, , , , SymbolMasken)
                                End If
                            End If
                        Else
                            addMenueitem("Truppenbau", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Omega-Bau.png"), Symbolen, Namen, , , , SymbolMasken)
                        End If
                    Case "bauen"
                        addMenueitem("Bauen", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Omega-Bau.png"), Symbolen, Namen, , , , SymbolMasken)
                    Case "feuerrakete"
                        addMenueitem("feuerrakete", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Feuer.png"), Symbolen, Namen, , , , SymbolMasken)
                    Case "truppenbau+moveandfire"
                        If DataSettings.CommanderWarsGameModus = CommanderWarsGameModi.AdvanceWarsDC Then
                            If Objektverwalter.Spielfeld.AktuelleEinheit.Munition > 0 Then
                                If Objektverwalter.Spielfeld.AktuelleEinheit.HasPlaceforLoading Then
                                    addMenueitem("Truppenbau", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Omega-Bau.png"), Symbolen, Namen, , , , SymbolMasken)
                                End If
                            End If
                        Else
                            addMenueitem("Truppenbau", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Omega-Bau.png"), Symbolen, Namen, , , , SymbolMasken)
                        End If
                    Case "bauen+ration"
                        addMenueitem("Bauen", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Omega-Bau.png"), Symbolen, Namen, , , , SymbolMasken)
                        If KannRation() Then
                            addMenueitem("Ration", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Ration.png"), Symbolen, Namen, , , , SymbolMasken)
                        End If
                End Select
            Next
            If KannZuKOAufwerten() Then
                addMenueitem("KO Einheit", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Warten.png"), Symbolen, Namen, , , , SymbolMasken)
            End If

            addMenueitem("Warten", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Warten.png"), Symbolen, Namen, , , , SymbolMasken)

            If KannSchicken() Then
                addMenueitem("Einheit schicken", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Einheit schicken.png"), Symbolen, Namen, , , , SymbolMasken)
            End If
        End If
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        M.Spielmodus = ObjektSpielMenue.Spielmodi.AuswahlmenueEinheit
        EinheitenMenue = New ObjektEinheitenmenue(Namen.ToArray, Symbolen.ToArray, Spielfeld.AktuellerSpieler.Spieler, Hauptmenue.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, False, Nothing, False, True, ObjektEinheitenmenue.Modi.Anderes, SymbolMasken.ToArray)
    End Sub
    Public Shared Function KannGeladenwerden(ByVal Einheit As ObjektEinheit, ByVal Frachter As ObjektEinheit) As Boolean
        Dim NumberOfLoadedUnits As Integer = 0
        If IsNothing(Frachter) = False Then
            If FindElement(Frachter.GeladeneEinheitenIDs, Einheit.EinheitenID) >= 0 Then
                For I = 0 To Frachter.Ladung.Length - 1
                    If IsNothing(Frachter.Ladung(I)) Then
                        NumberOfLoadedUnits += Einheit.Get_Unit_Space()
                        If NumberOfLoadedUnits <= Frachter.Ladung.Length Then
                            Return True
                        Else
                            Return False
                        End If
                    Else
                        NumberOfLoadedUnits += Frachter.Ladung(I).Get_Unit_Space()
                    End If
                Next
            Else
                Return False
            End If
        Else
            Return False
        End If
        Return False
    End Function

    Public Shared Function KannAngreifen(ByVal Einheit As ObjektEinheit, Optional ByVal NichtBewegt As Boolean = False) As Boolean
        Dim Kreis(,) As Integer = {}
        Dim MaximalReichweite As Integer = -1
        Dim Minmalreichweite As Integer = Einheit.MinimaleReichweite
        Dim XPosition As Integer = Spielfeld.AktuelleEinheitPosition.X
        Dim YPosition As Integer = Spielfeld.AktuelleEinheitPosition.Y
        If IsNothing(Spielfeld.Laufen) = False Then
            XPosition = Spielfeld.Laufen.Position.X
            YPosition = Spielfeld.Laufen.Position.Y
        End If
        MaximalReichweite = Spielfeld.AktuelleEinheit.MaximaleReichweite
        Dim Stelle As Integer = Array.IndexOf(Spielfeld.AktuellerSpieler.KOS(0).WetterartfuerSenker, Spielfeld.Regeln.Wetter)
        Kreis = Kreisfunktion(MaximalReichweite)
        If Kreis.Length >= 0 Then
            For X = 0 To Kreis.GetLength(0) - 1
                For Y = 0 To Kreis.GetLength(1) - 1
                    If Kreis(X, Y) > 0 Then
                        If Kreis(X, Y) >= Spielfeld.AktuelleEinheit.MinimaleReichweite Or Not Einheit.Waffe1 = "Keine" Then
                            If Objektverwalter.Spielfeld.OnMap(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y) Then
                                If Not Objektverwalter.Spielfeld.Landschaften(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Einheit.GetMap).Hidden Then
                                    If IsNothing(Spielfeld.Einheiten(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Einheit.GetMap)) = False Then
                                        If Not Spielfeld.Spieler(Spielfeld.Einheiten(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Einheit.GetMap).Spieler).Team = Spielfeld.Spieler(Spielfeld.AktuelleEinheit.Spieler).Team Then
                                            If Spielfeld.Einheiten(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Einheit.GetMap).Sichtbar = True Then
                                                Dim Fernkampf As Boolean = False
                                                If Kreis(X, Y) > 1 Then
                                                    Fernkampf = True
                                                End If
                                                If (Fernkampf And Spielfeld.Einheiten(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Einheit.GetMap).GetTarnung) Then
                                                    Return False
                                                End If
                                                If (Fernkampf And XPosition = Spielfeld.AktuelleEinheitPosition.X And YPosition = Spielfeld.AktuelleEinheitPosition.Y) Or (Not Fernkampf) Then
                                                    If Schadensberechnung(Spielfeld.AktuelleEinheit, XPosition, YPosition, XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, 100, 100, False, False, -999, Nothing, False)(0) >= 0 Then
                                                        Return True
                                                    End If
                                                End If
                                            End If
                                        End If
                                    ElseIf Spielfeld.Landschaften(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Einheit.GetMap).Leben > 0 Then
                                        Dim Fernkampf As Boolean = False
                                        If Kreis(X, Y) > 1 Then
                                            Fernkampf = True
                                        End If
                                        If Schadensberechnung(Spielfeld.AktuelleEinheit, XPosition, YPosition, XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, 100, 100, False, False, -999, Nothing, False)(0) >= 0 Then
                                            Return True
                                        End If
                                    ElseIf IsNothing(Spielfeld.Landschaften(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Einheit.GetMap).Gebaeude) = False Then
                                        If Spielfeld.Landschaften(Spielfeld.Landschaften(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Einheit.GetMap).Gebaeude.Rechteck.X, Spielfeld.Landschaften(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Einheit.GetMap).Gebaeude.Rechteck.Y, Einheit.GetMap).Gebaeude.GetKP(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, False) > 0 Then
                                            If Not Spielfeld.Spieler(Spielfeld.Landschaften(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Einheit.GetMap).Gebaeude.Spieler).Team = Spielfeld.Spieler(Spielfeld.AktuelleEinheit.Spieler).Team Then
                                                Dim Fernkampf As Boolean = False
                                                If Kreis(X, Y) > 1 Then
                                                    Fernkampf = True
                                                End If
                                                If Schadensberechnung(Spielfeld.AktuelleEinheit, XPosition, YPosition, XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, 100, 100, False, False, -999, Nothing, False)(0) >= 0 Then
                                                    Return True
                                                End If
                                            End If
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        End If
        Return False
    End Function
    Public Shared Function KannEinen() As Boolean
        If Spielfeld.AktuelleEinheit.EinheitenID = Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.AktuelleEinheit.GetMap).EinheitenID Then
            If Spielfeld.AktuelleEinheit.Spieler = Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.AktuelleEinheit.GetMap).Spieler Then
                If Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.AktuelleEinheit.GetMap).KP <= 90 Then
                    Return True
                End If
            End If
        End If
        Return False
    End Function
    Public Shared Function KannEntladen() As Boolean
        If Spielfeld.AktuelleEinheit.Ladung.Length > 0 Then
            If IsNothing(Spielfeld.AktuelleEinheit.Ladung(0)) = False Then
                If IsNothing(Spielfeld.Laufen) Then
                    If Array.IndexOf(Spielfeld.AktuelleEinheit.EntladungsUntergrund, Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.AktuelleEinheit.GetMap).getID) >= 0 Then
                        Return True
                    End If
                Else
                    If Array.IndexOf(Spielfeld.AktuelleEinheit.EntladungsUntergrund, Spielfeld.Landschaften(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.AktuelleEinheit.GetMap).getID) >= 0 Then
                        Return True
                    End If
                End If
            End If
        End If
        Return False
    End Function
    Public Shared Function KannEntladen(ByVal ZuentladendeEinheit As ObjektEinheit, ByVal X As Integer, ByVal Y As Integer) As Boolean
        Dim Feld As New Point(X, Y)
        For I = 0 To 3
            Select Case I
                Case 0
                    Feld.Y -= 1
                Case 1
                    Feld.Y += 1
                    Feld.X += 1
                Case 2
                    Feld.Y += 1
                    Feld.X -= 1
                Case 3
                    Feld.Y -= 1
                    Feld.X -= 1
            End Select
            If Spielfeld.OnMap(Feld.X, Feld.Y) Then

                If Bewegungskosten(ZuentladendeEinheit, Spielfeld.Landschaften(Feld.X, Feld.Y, Spielfeld.AktuelleEinheit.GetMap).getID, Spielfeld.Regeln.Wetter, Feld.X, Feld.Y) > 0 And IsNothing(Spielfeld.Einheiten(Feld.X, Feld.Y, Spielfeld.AktuelleEinheit.GetMap)) = True Then
                    Return True
                End If
            End If
        Next
        Return False
    End Function
    Public Shared Function KannBesetzen(ByVal X As Integer, ByVal Y As Integer) As Boolean
        If IsNothing(Spielfeld.Landschaften(X, Y, Spielfeld.AktuelleEinheit.GetMap).Gebaeude) = False Then
            If Spielfeld.AktuelleEinheit.KannBesetzen = True Then
                If Spielfeld.Landschaften(X, Y, Spielfeld.AktuelleEinheit.GetMap).Gebaeude.Besetzung > 0 Then
                    If Not Spielfeld.Spieler(Spielfeld.Landschaften(X, Y, Spielfeld.AktuelleEinheit.GetMap).Gebaeude.Spieler).Team = Spielfeld.Spieler(Spielfeld.AktuelleEinheit.Spieler).Team Then
                        Return True
                    End If
                End If
            End If
        End If
    End Function
    Public Shared Function KannRation() As Boolean
        Dim Feld As Point
        If IsNothing(Spielfeld.Laufen) Then
            Feld = New Point(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y)
        Else
            Feld = New Point(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y)
        End If
        For I = 0 To 3
            Select Case I
                Case 0
                    Feld.Y -= 1
                Case 1
                    Feld.Y += 1
                    Feld.X += 1
                Case 2
                    Feld.Y += 1
                    Feld.X -= 1
                Case 3
                    Feld.Y -= 1
                    Feld.X -= 1
            End Select
            If Spielfeld.OnMap(Feld.X, Feld.Y) Then
                If IsNothing(Spielfeld.Einheiten(Feld.X, Feld.Y, Spielfeld.AktuelleEinheit.GetMap)) = False Then
                    If Spielfeld.Einheiten(Feld.X, Feld.Y, Spielfeld.AktuelleEinheit.GetMap).Spieler = Spielfeld.AktuelleEinheit.Spieler Then
                        If Spielfeld.AktuelleEinheit.Faehigkeit = "RationSame" Then
                            If Spielfeld.Einheiten(Feld.X, Feld.Y, Spielfeld.AktuelleEinheit.GetMap).IsGroundUnit = Spielfeld.AktuelleEinheit.IsGroundUnit Or _
                                Spielfeld.Einheiten(Feld.X, Feld.Y, Spielfeld.AktuelleEinheit.GetMap).IsFlyingUnit = Spielfeld.AktuelleEinheit.IsFlyingUnit Or _
                                Spielfeld.Einheiten(Feld.X, Feld.Y, Spielfeld.AktuelleEinheit.GetMap).IsSeaUnit = Spielfeld.AktuelleEinheit.IsSeaUnit Then
                                Return True
                            End If
                        Else
                            Return True
                        End If

                    End If
                End If
            End If
        Next
        Return False
    End Function
    Public Shared Function KannRaketeZuenden() As Boolean
        If Spielfeld.AktuelleEinheit.KannBesetzen = True Then
            Dim X As Integer
            Dim Y As Integer
            If IsNothing(Spielfeld.Laufen) Then
                X = Spielfeld.AktuelleEinheitPosition.X : Y = Spielfeld.AktuelleEinheitPosition.Y
            Else
                X = Spielfeld.Laufen.Position.X : Y = Spielfeld.Laufen.Position.Y
            End If
            If IsNothing(Spielfeld.Landschaften(X, Y, Spielfeld.AktuelleEinheit.GetMap).Gebaeude) = False Then
                If Spielfeld.Landschaften(X, Y, Spielfeld.AktuelleEinheit.GetMap).Gebaeude.Angriff = ObjektGebaeude.Angriffe.Silo Then
                    Return True
                End If
            End If
        End If
        Return False
    End Function
    Public Shared Function KannZuKOAufwerten() As Boolean
        If Spielfeld.Regeln.KOSystem > KOSysteme.Gabe_Modus Then
            If Spielfeld.Spieler(Spielfeld.AktuelleEinheit.Spieler).KOS(0).GetKOUnit Is Nothing Then
                Dim XPosition As Integer = Spielfeld.AktuelleEinheitPosition.X
                Dim YPosition As Integer = Spielfeld.AktuelleEinheitPosition.Y
                If IsNothing(Spielfeld.Laufen) = False Then
                    XPosition = Spielfeld.Laufen.Position.X
                    YPosition = Spielfeld.Laufen.Position.Y
                End If
                Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(XPosition, YPosition, Spielfeld.MomentaneSchlacht).Gebaeude
                If Spielfeld.AktuelleEinheit.Kosten / 2 <= Spielfeld.AktuellerSpieler.Fonds Then
                    If Not G Is Nothing Then
                        If G.GetSpieler.Team = Spielfeld.AktuellerSpieler.Team Then
                            If G.GetBaulisteThisPlayer.Contains(Spielfeld.AktuelleEinheit.EinheitenID) Or (G.Angriff = ObjektGebaeude.Angriffe.HQ And Spielfeld.AktuelleEinheit.IsGroundUnit) Then
                                Return True
                            End If
                        End If
                    End If
                End If
            End If
        End If
        Return False
    End Function
    Public Shared Function CanBuildTempBase() As Boolean
        If Spielfeld.AktuelleEinheit.Munition > 0 Then
            If Spielfeld.AktuelleEinheit.HasMaterial Then
                Dim Pos As Point
                If Spielfeld.Laufen Is Nothing Then
                    Pos = New Point(Spielfeld.AktuelleEinheit.X, Spielfeld.AktuelleEinheit.Y)
                Else
                    Pos = Spielfeld.Laufen.Position
                End If
                Dim L As ObjektLandschaft = Objektverwalter.Spielfeld.Landschaften(Pos.X, Pos.Y, Spielfeld.AktuelleEinheit.GetMap)
                Select Case L.getID.ToUpper
                    Case "EBENE", "SCHNEE", "WUESTE", "STRAND"
                        Return True
                End Select
            End If
        End If
        Return False
    End Function
#End Region
#Region "Ins Nichts Menue"
    Public Shared Sub AuswahlMenuerschaffen()
        Spielfeld.AktuelleEinheitPosition = New Point(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y)
        Dim Symbolen As New Stack(Of Texture)
        Dim Namen As New Stack(Of String)
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then
            addMenueitem("Schlacht Wechsel", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\SchlachtWechsel.png"), Symbolen, Namen)
        End If
        If Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
            If Spielfeld.AktuellerSpieler.KannGabe Then
                addMenueitem("Gabe", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Gabe.png"), Symbolen, Namen)
                If Spielfeld.AktuellerSpieler.KannSpezialGabe Then
                    addMenueitem("Spezialgabe", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Spezialgabe.png"), Symbolen, Namen)
                    If Spielfeld.AktuellerSpieler.KannDoppelGabe Then
                        addMenueitem("Doppelgabe", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Doppelgabe.png"), Symbolen, Namen)
                    End If
                End If
            ElseIf Spielfeld.AktuellerSpieler.KannSpezialGabe Then
                addMenueitem("Spezialgabe", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Spezialgabe.png"), Symbolen, Namen)
                If Spielfeld.AktuellerSpieler.KannDoppelGabe Then
                    addMenueitem("Doppelgabe", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Doppelgabe.png"), Symbolen, Namen)
                End If
            End If
        End If

        If Spielfeld.Regeln.SitutionsSitzung IsNot Nothing Then
            If Spielfeld.Regeln.SitutionsSitzung.Count > 0 Then
                addMenueitem("Strategie", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Hilfe.png"), Symbolen, Namen)
            End If
        End If

        addMenueitem("Siegbedingung", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Hilfe.png"), Symbolen, Namen)

        addMenueitem("KO", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\KO.png"), Symbolen, Namen)
        addMenueitem("Abzug", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Abziehen.png"), Symbolen, Namen)
        addMenueitem("Musik", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Musik.png"), Symbolen, Namen)
        addMenueitem("Kampfanimationen", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Animationen.png"), Symbolen, Namen)
        addMenueitem("Speichern", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Speichern.png"), Symbolen, Namen)
        addMenueitem("Beenden", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Beenden.png"), Symbolen, Namen)
        If Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Doppelgabe Then
            If Spielfeld.AktuellerSpieler.KOS(1).Gabemodus = ObjektKO.Gabemodi.Doppelgabe Then
                addMenueitem("Naechster Spieler", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Naechster Spieler.png"), Symbolen, Namen)
            Else
                addMenueitem("Wechsel", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Wechsel.png"), Symbolen, Namen)
            End If
        Else
            addMenueitem("Naechster Spieler", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Naechster Spieler.png"), Symbolen, Namen)
            If IsNothing(Spielfeld.AktuellerSpieler.KOS(1)) = False Then
                addMenueitem("Wechsel", Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Wechsel.png"), Symbolen, Namen)
            End If
        End If


        EinheitenMenue = New ObjektEinheitenmenue(Namen.ToArray, Symbolen.ToArray, Spielfeld.AktuellerSpieler.Spieler, Hauptmenue.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, False, Nothing, False, True, ObjektEinheitenmenue.Modi.Anderes)
    End Sub
    Public Shared Sub AuswahlAnimationsMenuerschaffen(ByVal X As Integer, ByVal Y As Integer)
        Spielfeld.AktuelleEinheitPosition = New Point(X, Y)
        Dim Symbolen As New Stack(Of Texture)
        Dim Namen As New Stack(Of String)
        Dim Names As String() = [Enum].GetNames(KampfanimationsTypen.Alle.GetType)
        For I = 0 To Names.Length - 1
            addMenueitem(Names(I), Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Animationen.png"), Symbolen, Namen)
        Next
        EinheitenMenue = New ObjektEinheitenmenue(Namen.ToArray, Symbolen.ToArray, Spielfeld.AktuellerSpieler.Spieler, Hauptmenue.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, False, Nothing, False, True, ObjektEinheitenmenue.Modi.Anderes)
    End Sub
#End Region
#End Region
    ''' <summary>
    ''' Does Extra Actions for Example Feldtarnung or Move Damage
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub DoExtraActions()
        'Move Damage
        If Not MoveActionDone Then
            MoveActionDone = True
            Dim MoveDamage As Integer = 0
            For Each P In Spielfeld.Spieler
                If P.Team <> Spielfeld.AktuellerSpieler.Team Then
                    MoveDamage += P.KOS(0).MoveDamage
                End If
            Next
            If MoveDamage <> 0 Then
                If Spielfeld.Laufen IsNot Nothing Then
                    Spielfeld.AktuelleEinheit.DoDamage(MoveDamage * (Spielfeld.Laufen.BackUpWegPunkteX.Length - 1))
                End If
            End If
            If Objektverwalter.Spielfeld.Wegsuchsystem IsNot Nothing Then
                If Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX.Length - 1 <= Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuelleEinheit.Spieler).KOS(0).FeldtarnungsReichweite Then
                    If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuelleEinheit.Spieler).KOS(0).FeldtarnungsReichweite >= 0 Then
                        Dim X1 As Integer = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
                        Dim Y1 As Integer = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
                        If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                            X1 = Objektverwalter.Spielfeld.Laufen.Position.X
                            Y1 = Objektverwalter.Spielfeld.Laufen.Position.Y
                        End If
                        If Spielfeld.AktuellerSpieler.KOS(0).KOBoostApply(X1, Y1) Then
                            Objektverwalter.Spielfeld.AktuelleEinheit.SetFeldtarnung(True)
                        Else
                            Objektverwalter.Spielfeld.AktuelleEinheit.SetFeldtarnung(False)
                        End If
                    Else
                        Objektverwalter.Spielfeld.AktuelleEinheit.SetFeldtarnung(False)
                    End If
                Else
                    Objektverwalter.Spielfeld.AktuelleEinheit.SetFeldtarnung(False)
                End If
            End If
        End If
    End Sub
    Public Shared Sub Einheitauswaehlen(ByVal X As Integer, ByVal Y As Integer, Optional ByVal WSS As Wegsuchsystem = Nothing)
        If Not Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Hidden Then
            'Bevor wir diese Einheit auswaehlen und uns mal wieder mit warten verklicken, weil wir die Maus benutzen, speichern wir lieber mal ab, damit wir spaeter mit Strg+Z rueckgaengig machen koenne, was wir rueckgaengig machen wollen.
            Autospeichern()
            'So jetzt darf man wieder Speichern
            AlreadySaved = False

            Dim M As ObjektSpielMenue = Objektverwalter.Menue
            If IsNothing(Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht)) = False Then
                If Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).Sichtbar = True Then
                    SelectUnit(X, Y, WSS, M)
                ElseIf Not Objektverwalter.Spielfeld.CurrentAI Is Nothing Then
                    If Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                        SelectUnit(X, Y, WSS, M)
                    End If
                End If
            End If
            If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
                ObjektMaus.Visible = False
                Objektverwalter.Spielfeld.EingabenErlauben = False
            End If
        End If
    End Sub
    Private Shared Sub SelectUnit(ByVal X As Integer, ByVal Y As Integer, ByVal WSS As Wegsuchsystem, ByVal M As ObjektSpielMenue)
        MoveActionDone = False
        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Select Unit at X=" + X.ToString + ", Y=" + Y.ToString)
        End If
        If Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
            Spielfeld.AktuelleEinheitPfeil = New ObjektPfeil()
        End If
        M.Spielmodus = ObjektSpielMenue.Spielmodi.Einheitausgewaehlt
        Spielfeld.AktuelleEinheit = Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht)
        Spielfeld.AktuelleEinheitPosition = New Point(X, Y)
        Dim Bewegunspunkte As Integer = Spielfeld.AktuelleEinheit.GetMovementRange
        If WSS Is Nothing Then
            If Bewegunspunkte <= Spielfeld.AktuelleEinheit.Treibstoff Then
                Spielfeld.Wegsuchsystem = New Wegsuchsystem(Spielfeld.AktuelleEinheit, X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Bewegunspunkte)
            ElseIf Spielfeld.AktuelleEinheit.Treibstoff = -1 Then
                Spielfeld.Wegsuchsystem = New Wegsuchsystem(Spielfeld.AktuelleEinheit, X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Bewegunspunkte)
            Else
                Spielfeld.Wegsuchsystem = New Wegsuchsystem(Spielfeld.AktuelleEinheit, X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Spielfeld.AktuelleEinheit.Treibstoff)
            End If
        Else
            Spielfeld.Wegsuchsystem = WSS
        End If
        If Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
            For X = 0 To Spielfeld.Breite - 1
                For Y = 0 To Spielfeld.Hoehe - 1
                    If Spielfeld.Wegsuchsystem.getBewegungspunktekosten(X, Y) >= 0 Then
                        If Spielfeld.Wegsuchsystem.getBewegungspunktekosten(X, Y) <= Bewegunspunkte Then
                            neuMarkiertesFeld(X, Y, Color.FromArgb(150, 255, 255, 255))
                        ElseIf Spielfeld.Wegsuchsystem.GetBewegungspunktekostenReal(X, Y, Spielfeld.AktuelleEinheit.GetMap) <= Bewegunspunkte Then
                            Dim E As ObjektEinheit = Spielfeld.Einheiten(X, Y, Spielfeld.AktuelleEinheit.GetMap)
                            If E IsNot Nothing Then
                                If E.GetSpieler.Team = Spielfeld.AktuellerSpieler.Team Then
                                    neuMarkiertesFeld(X, Y, Color.FromArgb(150, 255, 255, 255))
                                End If
                            End If
                        End If
                    End If
                Next
            Next
            MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Overworld\Einheitausgewaehlt.wav", False)
        End If
    End Sub
    ''' <summary>
    ''' Wenn momentan eine Einheit ausgewaehlt ist wird sie abgewaehlt
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub Einheitabwaehlen(Optional ByVal OhneSound As Boolean = False)
        AlreadySaved = True
        If Spielfeld.AktuelleEinheitHatGefeuert = True Then
            Warten()
        Else
            If IsNothing(Spielfeld.Laufen) Then
                MarkierteFelder.Clear()
                Spielfeld.AktuelleEinheit = Nothing
                Spielfeld.AktuelleEinheitPosition = Nothing
                Spielfeld.Wegsuchsystem = Nothing
                Spielfeld.AktuelleEinheitPfeil = Nothing
                Dim M As ObjektSpielMenue = Objektverwalter.Menue
                M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts
            Else
                Spielfeld.LaufenLoeschen = True
                Spielfeld.Einheiten(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht) = Spielfeld.AktuelleEinheit
                Spielfeld.Laufen.Position = Spielfeld.AktuelleEinheitPosition
                Einheitauswaehlen(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y)
            End If
            If Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch And OhneSound = False Then
                MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Abrechen.wav", False)
            End If
        End If
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    ''' <summary>
    ''' Fuehrt einen Angriff aus 
    ''' </summary>
    ''' <param name="Angreifer"></param>
    ''' <param name="VerteidigerX"></param>
    ''' <param name="VerteidigerY"></param>
    ''' <remarks></remarks>
    Public Shared Sub Angriff(ByVal Angreifer As ObjektEinheit, ByVal VerteidigerX As Integer, ByVal VerteidigerY As Integer, Optional ByVal InstantBattle As Boolean = False)
        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write(Sprachconverter.Translate(Angreifer.Einheitenname) + " attacks Unit at X=" + VerteidigerX.ToString + ", Y=" + VerteidigerY.ToString)
        End If

        Dim Fernkampf As Boolean = False
        Dim Verteidiger As ObjektEinheit = Spielfeld.Einheiten(VerteidigerX, VerteidigerY, Angreifer.GetMap)
        Dim X As Integer = -1
        Dim Y As Integer = -1
        If IsNothing(Spielfeld.Laufen) Then
            X = Angreifer.X
            Y = Angreifer.Y
        Else
            X = Spielfeld.Laufen.Position.X
            Y = Spielfeld.Laufen.Position.Y
        End If
        If Math.Abs(X - VerteidigerX) + Math.Abs(Y - VerteidigerY) > 1 Then
            Fernkampf = True
        End If
        Dim AngreiferLeben As Single = Angreifer.Leben
        Dim VerteidigerLeben As Single = 0
        If IsNothing(Verteidiger) = False Then
            VerteidigerLeben = Verteidiger.Leben
        End If
        Dim AngreiferSchaden() As Single = Schadensberechnung(Angreifer, X, Y, VerteidigerX, VerteidigerY, AngreiferLeben, VerteidigerLeben, False, True, -999, Nothing, False)
        Dim VerteidigerSchaden() As Single = {-1, -1}
        If IsNothing(Verteidiger) = False Then
            If VerteidigerLeben > 0 And Fernkampf = False Then
                VerteidigerSchaden = Schadensberechnung(Verteidiger, Verteidiger.X, VerteidigerY, X, Y, VerteidigerLeben, AngreiferLeben, True, True, -999, Nothing, False)
            End If
        End If

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            If InstantBattle Then
                Befehl.Befehl = ObjektKI.KIModiExtern.InstantBattle
            Else
                Befehl.Befehl = ObjektKI.KIModiExtern.Angriff
            End If

            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Angreifer.X}
                Befehl.WegY = New Integer() {Angreifer.Y}
            End If
            Befehl.OpferX = VerteidigerX
            Befehl.OpferY = VerteidigerY
            Befehl.AngreiferSchaden = AngreiferSchaden(0)
            Befehl.Verteidigerschaden = VerteidigerSchaden(0)
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If

        DoExtraActions()
        If InstantBattle Then
            Dim A As New ObjektAngriff(X, Y, Spielfeld.Landschaften(X, Y, Angreifer.GetMap), VerteidigerX, VerteidigerY, Fernkampf, AngreiferSchaden, VerteidigerSchaden, True, InstantBattle)
            A = Nothing
        Else
            Spielfeld.Angriff = New ObjektAngriff(X, Y, Spielfeld.Landschaften(X, Y, Angreifer.GetMap), VerteidigerX, VerteidigerY, Fernkampf, AngreiferSchaden, VerteidigerSchaden)
        End If
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If

    End Sub
    ''' <summary>
    ''' Fuehrt einen Angriff aus 
    ''' </summary>
    ''' <param name="Angreifer"></param>
    ''' <param name="VerteidigerX"></param>
    ''' <param name="VerteidigerY"></param>
    ''' <remarks></remarks>
    Public Shared Sub Angriff(ByVal Angreifer As ObjektEinheit, ByVal VerteidigerX As Integer, ByVal VerteidigerY As Integer, ByVal AngreiferSchaden As Single, ByVal VerteidigerSchaden As Single, Optional ByVal InstantBattle As Boolean = False)

        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write(Angreifer.Einheitenname + " attacks Unit at X=" + VerteidigerX.ToString + ", Y=" + VerteidigerY.ToString)
        End If

        Dim Fernkampf As Boolean = False
        Dim Verteidiger As ObjektEinheit = Spielfeld.Einheiten(VerteidigerX, VerteidigerY, Angreifer.GetMap)
        Dim X As Integer = -1
        Dim Y As Integer = -1
        If IsNothing(Spielfeld.Laufen) Then
            X = Spielfeld.AktuelleEinheitPosition.X
            Y = Spielfeld.AktuelleEinheitPosition.Y
        Else
            X = Spielfeld.Laufen.Position.X
            Y = Spielfeld.Laufen.Position.Y
        End If
        If Math.Abs(X - VerteidigerX) + Math.Abs(Y - VerteidigerY) > 1 Then
            Fernkampf = True
        End If
        Dim AngreiferLeben As Single = Angreifer.Leben
        Dim VerteidigerLeben As Single = 0
        If IsNothing(Verteidiger) = False Then
            VerteidigerLeben = Verteidiger.Leben
        End If
        Dim AngreiferSchaden1() As Single = Schadensberechnung(Angreifer, X, Y, VerteidigerX, VerteidigerY, AngreiferLeben, VerteidigerLeben, False, True, -999, Nothing, False)
        Dim VerteidigerSchaden1() As Single = {-1, -1}
        If IsNothing(Verteidiger) = False Then
            If VerteidigerLeben > 0 And Fernkampf = False Then
                VerteidigerSchaden1 = Schadensberechnung(Verteidiger, Verteidiger.X, VerteidigerY, X, Y, VerteidigerLeben, AngreiferLeben, True, False, -999, Nothing, False)
            End If
        End If
        AngreiferSchaden1(0) = AngreiferSchaden
        VerteidigerSchaden1(0) = VerteidigerSchaden

        DoExtraActions()
        If InstantBattle Then
            Dim A As New ObjektAngriff(X, Y, Spielfeld.Landschaften(X, Y, Angreifer.GetMap), VerteidigerX, VerteidigerY, Fernkampf, AngreiferSchaden1, VerteidigerSchaden1, True, InstantBattle)
            A = Nothing
        Else
            Spielfeld.Angriff = New ObjektAngriff(X, Y, Spielfeld.Landschaften(X, Y, Angreifer.GetMap), VerteidigerX, VerteidigerY, Fernkampf, AngreiferSchaden1, VerteidigerSchaden1)
        End If

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    Public Shared Sub LechtraketeAbfeuern(ByVal X As Integer, ByVal Y As Integer)
        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Fire Fogmissile at X=" + X.ToString + ", Y=" + Y.ToString)
        End If


        Dim X1 As Integer = -1
        Dim Y1 As Integer = -1
        If IsNothing(Spielfeld.Laufen) Then
            X1 = Spielfeld.AktuelleEinheit.X
            Y1 = Spielfeld.AktuelleEinheit.Y
        Else
            X1 = Spielfeld.Laufen.Position.X
            Y1 = Spielfeld.Laufen.Position.Y
        End If

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Angriff
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {X1}
                Befehl.WegY = New Integer() {Y1}
            End If
            Befehl.OpferX = X
            Befehl.OpferY = Y
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If

        Array.Resize(Spielfeld.AktuellerSpieler.Sichtfelder, Spielfeld.AktuellerSpieler.Sichtfelder.Length + 1)
        Spielfeld.AktuellerSpieler.Sichtfelder(Spielfeld.AktuellerSpieler.Sichtfelder.Length - 1) = New Vector4(X, Y, Spielfeld.MomentaneSchlacht, 2)
        MarkierteFelder.Clear()
        Warten()
    End Sub
    ''' <summary>
    ''' Berechnet den Schaden der mit einem bestimmten Lebens Anteil verursacht wird und gibt das Leben von Angreifer und Verteidiger zurueck
    ''' </summary>
    ''' <param name="Angreifer"></param>
    ''' <param name="AngreiferX"></param>
    ''' <param name="AngreiferY"></param>
    ''' <param name="VerteidigerX"></param>
    ''' <param name="Verteidigery"></param>
    ''' <param name="AngreiferLeben"></param>
    ''' <param name="VerteidigerLeben"></param>
    ''' <param name="MitAngreiferGlueck"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function Schadensberechnung(ByVal Angreifer As ObjektEinheit, ByVal AngreiferX As Integer, ByVal AngreiferY As Integer, ByVal VerteidigerX As Integer, ByVal VerteidigerY As Integer, ByRef AngreiferLeben As Single, ByRef VerteidigerLeben As Single, ByVal CounterAttack As Boolean, ByVal MitAngreiferGlueck As Boolean, ByVal AngreiferGlueck As Integer, ByVal Verteidiger As ObjektEinheit, ByVal VirtualDistance As Boolean, Optional ByVal IgnoreDefence As Boolean = False) As Single()
        '                                                                                                                                                                                                                                                                                                                                   = False                             = -999                              = Nothing                        =false                '=false
        Dim Schaden() As Single = {-1, -1}
        'Nur unsere Infanterie kann angreifen
        If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).VeraenderteWerte.KeinAngriffausserINF = True Then
            If Not Angreifer.KannBesetzen = True Then
                'Hm das ist ein Panzer bloed gelaufen.
                Return Schaden
            End If
        End If
        Dim Fernkampf As Boolean = False
        If IsNothing(Verteidiger) Then
            Verteidiger = Spielfeld.Einheiten(VerteidigerX, VerteidigerY, Angreifer.GetMap)
        End If
        If Not VirtualDistance Then
            If Math.Abs(AngreiferX - VerteidigerX) + Math.Abs(AngreiferY - VerteidigerY) > 1 Then
                Fernkampf = True
            End If
        End If
        'Falls dies ein Rueckangriff ist kann es sein das der Verteidiger sich bewegt hat und nicht ausgewaehlt werden kann,
        'er ist aber die Aktuelle Einheit
        If IsNothing(Verteidiger) Then
            If IsNothing(Spielfeld.Laufen) Then
                If VerteidigerX = Spielfeld.AktuelleEinheitPosition.X And VerteidigerY = Spielfeld.AktuelleEinheitPosition.Y Then
                    Verteidiger = Spielfeld.AktuelleEinheit
                    'Hey der wir sind gegen Gegenschaden immun voll fett
                    If Verteidiger.GetSpieler.KOS(0).KOBoostApply(Verteidiger) Then
                        If Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).KeinGegenSchaden = True Then
                            Return Schaden
                        End If
                    End If
                ElseIf IsNothing(Spielfeld.CurrentAI) = False Then
                    'Die KI zieht das heisst die ausgewaehlte Einheit steht noch am Ausgangspunkt
                    If Not Spielfeld.AktuelleEinheit Is Nothing Then
                        If Not Angreifer.Equals(Spielfeld.AktuelleEinheit) Then
                            Verteidiger = Spielfeld.AktuelleEinheit
                        End If
                    End If
                    If Verteidiger Is Nothing Then
                        If Objektverwalter.Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude Is Nothing Then
                            If Objektverwalter.Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld.MomentaneSchlacht).Leben > 0 Then
                            Else
                                Return Schaden
                            End If
                        ElseIf Objektverwalter.Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.GetKP(VerteidigerX, VerteidigerY, False) > 0 Then
                            'Wir machen nichts
                        Else
                            Return Schaden
                        End If
                    Else
                        If Verteidiger.GetSpieler.KOS(0).KOBoostApply(Verteidiger) Then
                            If Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).KeinGegenSchaden = True Then
                                'Hey der wir sind gegen Gegenschaden immun voll fett
                                Return Schaden
                            End If
                        End If
                    End If
                End If
            Else
                If VerteidigerX = Spielfeld.Laufen.Position.X And VerteidigerY = Spielfeld.Laufen.Position.Y Then
                    Verteidiger = Spielfeld.AktuelleEinheit
                    If Verteidiger.GetSpieler.KOS(0).KOBoostApply(Verteidiger) Then
                        'Hey der wir sind gegen Gegenschaden immun voll fett
                        If Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).KeinGegenSchaden = True Then
                            Return Schaden
                        End If
                    End If
                End If
            End If
        Else
            'Wir wollen den Gegner angreifen.
            If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).KeinAngriffmitBilligerenTruppen = True Then
                'Der KO hat die Faehigkeit nur von teueren Truppen angegriffen zu werden. 
                If Verteidiger.GetSpieler.KOS(0).KOBoostApply(VerteidigerX, VerteidigerY) Then
                    If Angreifer.Kosten < Verteidiger.Kosten Then
                        'Sie ist billiger kein Angriff moeglich.=)
                        Return Schaden
                    End If
                End If
            End If
        End If
        If IsNothing(Verteidiger) = False Then
            'Wir greifen eine Einheit an.
            'Falls der Verteidiger getarnt ist kann er eventuell gar nicht angegriffen werden

            If Verteidiger.Sichtbar = False Then
                If Angreifer.Bewegungsart = Verteidiger.Bewegungsart Then
                    If Angreifer.Waffe1 = "Keine" Then
                        If Not Angreifer.Waffe2 = "Keine" Then
                            If Angreifer.MinimaleReichweite > 1 Then
                                'Die Einheit kann den Verteidiger nicht Angreifen, weil sie Getarnt ist
                                Return Schaden
                            End If
                        End If
                    End If
                Else
                    'Die Einheit kann nicht angreifen weil der Verteidiger getarnt ist
                    Return Schaden
                End If
            End If
            If Verteidiger.GetTarnung And (Fernkampf Or Verteidiger.Bewegungsart <> Angreifer.Bewegungsart) Then 'This should solve several AI and Userproblems with Hidden Units
                Return Schaden
            End If
            'Wir laden wenn moeglich die erste Waffe
            Dim Waffe1 As Boolean = False
            If Not Angreifer.Waffe1 = "Keine" And Fernkampf = False Then
                Waffe1 = True
            End If
            'wir laden eventuell die zweite Waffe
            Dim Waffe2 As Boolean = False
            If Angreifer.Munition > 0 Then
                If Fernkampf = True Or VirtualDistance Then
                    Waffe2 = True
                Else
                    If Angreifer.MinimaleReichweite = 1 Then
                        Waffe2 = True
                    End If
                End If
            End If
            'Die Einheit kann nicht Angreifen, weil sie keine Waffe besitzt
            If Waffe1 = False And Waffe2 = False Then Return Schaden
            'Wir schauen ob mit der Waffe 1 angegriffen werden kann und setzen den Schaden fest
            If Waffe1 = True Then
                Schaden(0) = Tabellenverwalter.GetWert(Angreifer.Waffe1, Verteidiger.EinheitenID)
                Schaden(1) = 1
            End If
            'Wir schauen ob mit der Waffe 2 angegriffen werden kann und ,ob der Schaden groesser ist als der der Waffe 1 und legen ihn dann gegebenenfalls fest
            If Waffe2 = True Then
                Dim Schaden1 = Tabellenverwalter.GetWert(Angreifer.Waffe2, Verteidiger.EinheitenID)
                If Schaden1 > Schaden(0) Then
                    Schaden(0) = Schaden1
                    Schaden(1) = 2
                    'A Virtual Attack, an Indirect Attack is stronger. No counter attack
                    If VirtualDistance Then
                        If Angreifer.MaximaleReichweite > 1 Then
                            Fernkampf = True
                        End If
                    End If
                End If
            End If
            Dim KOBoosts As Boolean = Angreifer.GetSpieler.KOS(0).KOBoostApply(AngreiferX, AngreiferY)
            'Wir wissen jetzt welchen Schaden wir anrichten
            If Schaden(0) >= 0 Then
                'wir holen uns die Angriffsstaerke des Angreifers
                Dim Offensivstaerke As Integer = (Spielfeld.Spieler(Angreifer.Spieler).GetOffensivStaerke(Angreifer, Spielfeld.Landschaften(AngreiferX, AngreiferY, Angreifer.GetMap), Verteidiger.X, Verteidiger.Y, AngreiferLeben, VerteidigerLeben, CounterAttack))
                'Falls die Einheit extremstark ist es sind voll  Schaeden auf 1 zusetzen die gleich 0 sind
                If Schaden(0) = 0 And Offensivstaerke > 150 Then
                    Schaden(0) = 1
                End If
                If DataSettings.CommanderWarsGameModus >= CommanderWarsGameModi.CommanderWars Then
                    Dim KP As Integer = getKP(AngreiferLeben)
                    Dim Kampfverstaerker As Integer = Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Kampfverstaerker * Angreifer.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY)
                    If KOBoosts Then
                        If Angreifer.GetSpieler.KOS(0).FeuerVerlustbeiKP Then
                            'Das ist die neue Formel fuer den Schaden aus DC
                            Schaden(0) = ((KP + Kampfverstaerker) / 10) * (Schaden(0)) * (Offensivstaerke) / (Spielfeld.Spieler(Verteidiger.Spieler).GetDeffensivStaerke(Verteidiger, Spielfeld.Landschaften(Verteidiger.X, Verteidiger.Y, Verteidiger.GetMap), Fernkampf, IgnoreDefence))
                        Else
                            'Das ist die neue Formel fuer den Schaden aus DC
                            Schaden(0) = ((10 + Kampfverstaerker) / 10) * (Schaden(0)) * (Offensivstaerke) / (Spielfeld.Spieler(Verteidiger.Spieler).GetDeffensivStaerke(Verteidiger, Spielfeld.Landschaften(Verteidiger.X, Verteidiger.Y, Verteidiger.GetMap), Fernkampf, IgnoreDefence))
                        End If
                    Else
                        'Das ist die neue Formel fuer den Schaden aus DC
                        Schaden(0) = ((KP + Kampfverstaerker) / 10) * (Schaden(0)) * (Offensivstaerke) / (Spielfeld.Spieler(Verteidiger.Spieler).GetDeffensivStaerke(Verteidiger, Spielfeld.Landschaften(Verteidiger.X, Verteidiger.Y, Verteidiger.GetMap), Fernkampf, IgnoreDefence))
                    End If
                Else 'Die Formel aus AW2 oder AW DS
                    'der Schaden wird um die Offensivstaerke erhoeht
                    Schaden(0) = (Schaden(0) / 100) * Offensivstaerke
                    'der Schaden wird eventuell wegen einer beschaedigten Einheit reduziert
                    Dim KP As Integer = getKP(AngreiferLeben)


                    Dim Kampfverstaerker As Integer = Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Kampfverstaerker * Angreifer.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY)
                    If Angreifer.GetSpieler.KOS(0).KOBoostApply(AngreiferX, AngreiferY) Then
                        If Angreifer.GetSpieler.KOS(0).FeuerVerlustbeiKP Then
                            Schaden(0) = (Schaden(0) / 10) * (KP + Kampfverstaerker)
                        Else
                            Schaden(0) = (Schaden(0) / 10) * (10 + Kampfverstaerker)
                        End If
                    Else
                        Schaden(0) = (Schaden(0) / 10) * (KP + Kampfverstaerker)
                    End If


                    'dieser Schaden wird jetzt evtl reduziert je nach deffensiv Staerke des Gegners
                    Schaden(0) -= Schaden(0) / 100 * (Spielfeld.Spieler(Verteidiger.Spieler).GetDeffensivStaerke(Verteidiger, Spielfeld.Landschaften(Verteidiger.X, Verteidiger.Y, Verteidiger.GetMap), Fernkampf, IgnoreDefence) - 100)
                    'Falls wir einen DoppelAngriff machen koennen tun wir das jetzt
                    If Spielfeld.Spieler(Angreifer.Spieler).KOS(0).DoppelAngriff > 0 Then
                        Schaden(0) += Schaden(0) * Spielfeld.Spieler(Angreifer.Spieler).KOS(0).DoppelAngriff * Angreifer.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY)
                    End If
                    If AngreiferLeben - VerteidigerLeben > 50 Then
                        'Die Einheit hat erheblich mehr KP und macht deshalb ein Zentel mehr Schaden
                        Schaden(0) += Schaden(0) / 10
                    End If
                End If
                'Jetzt wird eventuell das Glueck dazu addiert
                Dim Glueck As Integer = 0
                Dim Pech As Integer = 0
                If KOBoosts Then
                    If AngreiferGlueck = -999 Then
                        If MitAngreiferGlueck = True Then
                            Dim GP As Point = Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).GetGlueckPech(AngreiferX, AngreiferY)
                            Glueck = GP.X
                            Pech = GP.Y
                            'Manche KOs haben Max Glueck wenn der Gegner zerstoert wuerde.
                            If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).ImmerMaxGlueck = True Then
                                If Angreifer.GetSpieler.KOS(0).KOBoostApply(AngreiferX, AngreiferY) Then
                                    Pech = Glueck
                                End If
                            ElseIf Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).MaxGlueckbeiZerstoerung = True Then
                                If Angreifer.GetSpieler.KOS(0).KOBoostApply(AngreiferX, AngreiferY) Then
                                    If VerteidigerLeben - Schaden(0) - Glueck <= 0 Then
                                        'Mit Max Glueck ist sie tod dann haben wir das. Pech gehabt
                                        Pech = Glueck
                                    End If
                                End If
                            End If
                        End If
                    Else
                        Glueck = AngreiferGlueck
                        Pech = AngreiferGlueck
                    End If
                Else
                    Glueck = 5
                    Pech = 0
                End If
                Schaden(0) += Zufallszahl(Pech, Glueck)
                'Manche KOs haben die Faehigkeit eigen Schaden nochmals auf den Gegner zurueckzuwerfen, dass machen wir jetzt
                If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).ErhoehterGegenschadenbeiEigenSchaden <> 0 Then
                    If Angreifer.Leben - AngreiferLeben > 0 Then
                        Schaden(0) += (Angreifer.Leben - AngreiferLeben) * Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).ErhoehterGegenschadenbeiEigenSchaden * Angreifer.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY)
                    End If
                End If
                'Manche KOs richten mit jeder Einheit 5% mehr Schaden aus oder so. Sehr unfair.
                Schaden(0) += Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).FesterZusatzschadenUndDeffensive.X * Angreifer.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY)
                Schaden(0) -= Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).FesterZusatzschadenUndDeffensive.Y * Verteidiger.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY)

                'Falls der Schaden wegen uebermaessigen Pech kleiner  ist wird er auf Null gesetzt oder anderen Dingen
                If Schaden(0) < 0 Then
                    Schaden(0) = 0
                End If
                'Falls der KO des Angreifers eine Lebensentzug Faehigkeit besitzt geben wir das zurueck
                'Die Einheit kann nur einen gewissen Schaden erleiden und wir sind evtl. trueber.

                Dim MaxDmg As Single = 1 - ((1 - Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Maximalschaden) * Verteidiger.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY))

                If VerteidigerLeben - Schaden(0) < Verteidiger.KP * MaxDmg And Not Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Maximalschaden <= 0 Then
                    'Dann wird der Schaden auf das Maximum gesetzt
                    If Verteidiger.GetSpieler.KOS(0).KOBoostApply(VerteidigerX, VerteidigerY) Then
                        Schaden(0) = VerteidigerLeben - Verteidiger.KP * MaxDmg
                    End If
                End If
                'Das Opferleben wird gesenkt und ebenfalls zurueck gegeben
                VerteidigerLeben -= Schaden(0)
            End If
        ElseIf IsNothing(Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Angreifer.GetMap).Gebaeude) = False Then
            'wir greifen ein Gebaeude an!
            Dim Gebaeude As ObjektGebaeude = Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Angreifer.GetMap).Gebaeude
            'wir schauen ob mit der Waffe 1 angegriffen werden kann
            Dim Waffe1 As Boolean = False
            If Not Angreifer.Waffe1 = "Keine" Then
                Waffe1 = True
            End If
            'wir schauen ob mit der Waffe 2 angegriffen werden kann
            Dim Waffe2 As Boolean = False
            If Angreifer.Munition > 0 Then
                If Fernkampf = True Then
                    Waffe2 = True
                Else
                    If Angreifer.MinimaleReichweite = 1 Then
                        Waffe2 = True
                    End If
                End If
            End If
            'wir waehlen die Waffe 1 aus und legen den Schaden fest
            If Waffe1 = False And Waffe2 = False Then Return Schaden
            If Waffe1 = True Then
                Schaden(0) = Tabellenverwalter.GetWert(Angreifer.Waffe1, "Gebaeude")
                Schaden(1) = 1
            End If
            'Falls der Schaden der 2 Waffe groesser ist wird diese ausgewaehlt
            If Waffe2 = True Then
                Dim Schaden1 = Tabellenverwalter.GetWert(Angreifer.Waffe2, "Gebaeude")
                If Schaden1 > Schaden(0) Then
                    Schaden(0) = Schaden1
                    Schaden(1) = 2
                End If
            End If
            If Schaden(0) >= 0 Then
                'wir erhoehen den Schaden je nach KO Staerken
                Schaden(0) = Schaden(0) / 100 * Spielfeld.Spieler(Angreifer.Spieler).GetOffensivStaerke(Angreifer, Spielfeld.Landschaften(AngreiferX, AngreiferY, Angreifer.GetMap), -1, -1, -1, -1, CounterAttack)
                'Der Schaden wird je nach Leben der Einheit gesenkt

                Dim KP As Integer = getKP(AngreiferLeben)
                Dim Kampfverstaerker As Integer = Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Kampfverstaerker * Angreifer.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY)
                If Angreifer.GetSpieler.KOS(0).KOBoostApply(AngreiferX, AngreiferY) Then
                    If Angreifer.GetSpieler.KOS(0).FeuerVerlustbeiKP Then
                        KP += Kampfverstaerker
                    Else
                        KP = 10 + Kampfverstaerker
                    End If
                End If
                Schaden(0) = Schaden(0) / 10 * KP
            End If
        ElseIf Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Angreifer.GetMap).Leben > 0 Then
            'wir greifen ein Gebaeude an!

            'wir schauen ob mit der Waffe 1 angegriffen werden kann
            Dim Waffe1 As Boolean = False
            If Not Angreifer.Waffe1 = "Keine" Then
                Waffe1 = True
            End If
            'wir schauen ob mit der Waffe 2 angegriffen werden kann
            Dim Waffe2 As Boolean = False
            If Angreifer.Munition > 0 Then
                If Fernkampf = True Then
                    Waffe2 = True
                Else
                    If Angreifer.MinimaleReichweite = 1 Then
                        Waffe2 = True
                    End If
                End If
            End If
            'wir waehlen die Waffe 1 aus und legen den Schaden fest
            If Waffe1 = False And Waffe2 = False Then Return Schaden
            If Waffe1 = True Then
                Schaden(0) = Tabellenverwalter.GetWert(Angreifer.Waffe1, "Gebaeude")
                Schaden(1) = 1
            End If
            'Falls der Schaden der 2 Waffe groesser ist wird diese ausgewaehlt
            If Waffe2 = True Then
                Dim Schaden1 = Tabellenverwalter.GetWert(Angreifer.Waffe2, "Gebaeude")
                If Schaden1 > Schaden(0) Then
                    Schaden(0) = Schaden1
                    Schaden(1) = 2
                End If
            End If
            If Schaden(0) >= 0 Then
                'wir erhoehen den Schaden je nach KO Staerken
                Schaden(0) = Schaden(0) / 100 * Spielfeld.Spieler(Angreifer.Spieler).GetOffensivStaerke(Angreifer, Spielfeld.Landschaften(AngreiferX, AngreiferY, Angreifer.GetMap), -1, -1, -1, -1, CounterAttack)
                'Der Schaden wird je nach Leben der Einheit gesenkt
                Dim Kampfverstaerker As Integer = Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Kampfverstaerker * Angreifer.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY)
                If Angreifer.GetSpieler.KOS(0).KOBoostApply(AngreiferX, AngreiferY) Then
                    If Angreifer.GetSpieler.KOS(0).FeuerVerlustbeiKP Then
                        Schaden(0) = Schaden(0) / 10 * (getKP(AngreiferLeben) + Kampfverstaerker)
                    Else
                        Schaden(0) = Schaden(0) / 10 * (10 + Kampfverstaerker)
                    End If
                Else
                    Schaden(0) = Schaden(0) / 10 * (getKP(AngreiferLeben) + Kampfverstaerker)
                End If
            End If
        Else
            Schaden(0) = -1
            Schaden(1) = -1
        End If
        Return Schaden
    End Function

    Public Shared Function ArmyOffenceBoost(ByVal Unit As ObjektEinheit) As Integer
        Select Case Unit.GetSpieler.Armee
            Case Armeen.ML.ToString
                Return 5
            Case Armeen.OS.ToString
                Return -5
        End Select
    End Function
    ''' <summary>
    ''' Laesst die ausgewaehlte Einheit warten
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub Warten()
        If Not Objektverwalter.Spielfeld.AktuelleEinheit Is Nothing Then
            Konsole.Write("Selected Unit gets Order Wait.")
            If Spielfeld.AktuelleEinheit.MaximaleReichweite > 1 Then
                If IsNothing(Spielfeld.Laufen) Then
                    'Es ist eine Fernkampf Einheit
                    If Spielfeld.AktuellerSpieler.KOS(0).FireandMove = True Then
                        If Spielfeld.AktuelleEinheitHatGefeuert = False Then
                            Spielfeld.AktuelleEinheitHatGefeuert = True
                            Einheitauswaehlen(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y)
                            Exit Sub
                        End If
                    End If
                End If
            End If
            'Wenn wir ein Netzwerkspiel haben, muss das auch gesendet werden.

            If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                Dim Befehl As New KINetzwerkBefehl
                Befehl.Befehl = ObjektKI.KIModiExtern.Warten
                Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
                Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
                If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                    Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                    Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
                Else
                    Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                    Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
                End If
                Befehl.OpferX = Befehl.WegX(0)
                Befehl.OpferY = Befehl.WegY(0)
                Befehl.AngreiferSchaden = -1
                Befehl.Verteidigerschaden = -1
                Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
                Hauptmenue.NetzBefehlSenden(Befehl)
            End If

            'Wir legen die Feldtarnung fest.
            DoExtraActions()

            If IsNothing(Spielfeld.Laufen) Then
                MarkierteFelder.Clear()
                Spielfeld.AktuelleEinheit.HatsichBewegt = True
                Spielfeld.Einheiten(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht) = Spielfeld.AktuelleEinheit
                Hauptmenue.CursorPlazieren(Spielfeld.AktuelleEinheitPosition.X * Hauptmenue.Feldbreite, Spielfeld.AktuelleEinheitPosition.Y * Hauptmenue.Feldbreite)
            Else
                If Spielfeld.AktuelleEinheit.Besetzen = True Then
                    If IsNothing(Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebaeude) = False Then
                        'Dort konnte man besetzen
                        If Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebaeude.Besetzung > 0 Then
                            'Können wir am neuen feld besetzen?
                            If IsNothing(Spielfeld.Landschaften(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).Gebaeude) Then
                                'Nein Gebäude zurücksetzten und wir besetzten nicht mehr.
                                Spielfeld.AktuelleEinheit.Besetzen = False
                                Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebaeude.Besetzung = 20
                            Else
                                Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebaeude.Besetzung = 20
                                'Ja dort kann man besetzten  aber wir machen es nicht?
                                If Spielfeld.Landschaften(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).Gebaeude.Besetzung = 20 And BackbufferSpiel.GetBufferLength <> 1 Then
                                    Spielfeld.AktuelleEinheit.Besetzen = False
                                End If
                            End If
                        Else 'Das hier ist ein glitch hat niemand gesehen
                            Spielfeld.AktuelleEinheit.Besetzen = False
                        End If
                    Else
                        If TypeOf Spielfeld.AktuelleEinheit Is EinheitTTP Then
                            Dim TTP As EinheitTTP = Spielfeld.AktuelleEinheit
                            TTP.StopBuildTempBase()
                        End If
                    End If
                End If



                If Spielfeld.Regeln.Nebel = Nebelarten.Aus Then
                    If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                        Spielfeld.AktuelleEinheit.Treibstoff = -Objektverwalter.Spielfeld.AktuelleEinheitPfeil.TreibstoffVerbrauch
                    Else
                        Spielfeld.AktuelleEinheit.Treibstoff = -Spielfeld.Wegsuchsystem.getBewegungspunktekosten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y)
                    End If
                End If

                If Spielfeld.AktuelleEinheit.Bewegungsart = MovementSorts.Hoellium.ToString Then
                    If IsNothing(Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht)) = False Then
                        NeuObjektAnimation(New Point(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y), "Land", Objektverwalter.Spielfeld.MomentaneSchlacht)
                    End If
                End If
                Spielfeld.AktuelleEinheit.X = Spielfeld.Laufen.Position.X
                Spielfeld.AktuelleEinheit.Y = Spielfeld.Laufen.Position.Y
                Spielfeld.AktuelleEinheit.HatsichBewegt = True
                Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht) = Spielfeld.AktuelleEinheit
                Hauptmenue.CursorPlazieren(Spielfeld.Laufen.Position.X * Hauptmenue.Feldbreite, Spielfeld.Laufen.Position.Y * Hauptmenue.Feldbreite)
                Spielfeld.Laufen.UpdateSichtBereich()
                Spielfeld.LaufenLoeschen = True
            End If

            Spielfeld.AktuelleEinheit = Nothing
            Spielfeld.AktuelleEinheitPosition = Nothing
            Spielfeld.Wegsuchsystem = Nothing
            Spielfeld.AktuelleEinheitPfeil = Nothing
            Spielfeld.AktuelleEinheitHatGefeuert = False
        End If
        Spielfeld.Sichterstellen()
        Spielfeld.Regeln.CheckSieg()
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts
        ObjektScript.Pruefen(ObjektScript.Pruefstadien.RundenMitte)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    ''' <summary>
    ''' Laesst eine Einheit warten ohne sie auf Bewegt zu setzen
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub WartenOhneHatSichBewegt()
        DoExtraActions()
        If IsNothing(Spielfeld.Laufen) Then
            MarkierteFelder.Clear()
            Spielfeld.Einheiten(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht) = Spielfeld.AktuelleEinheit
            Hauptmenue.CursorPlazieren(Spielfeld.AktuelleEinheitPosition.X * Hauptmenue.Feldbreite, Spielfeld.AktuelleEinheitPosition.Y * Hauptmenue.Feldbreite)
        Else
            If Spielfeld.AktuelleEinheit.Besetzen = True Then
                If IsNothing(Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebaeude) = False Then
                    If IsNothing(Spielfeld.Landschaften(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).Gebaeude) Then
                        Spielfeld.AktuelleEinheit.Besetzen = False
                        Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebaeude.Besetzung = 20
                    Else
                        Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebaeude.Besetzung = 20
                    End If
                Else
                    If TypeOf Spielfeld.AktuelleEinheit Is EinheitTTP Then
                        Dim TTP As EinheitTTP = Spielfeld.AktuelleEinheit
                        TTP.StopBuildTempBase()
                    End If
                End If
            End If
            If Spielfeld.Regeln.Nebel = Nebelarten.Aus Then
                If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                    Spielfeld.AktuelleEinheit.Treibstoff = -Objektverwalter.Spielfeld.AktuelleEinheitPfeil.TreibstoffVerbrauch
                Else
                    Spielfeld.AktuelleEinheit.Treibstoff = -Spielfeld.Wegsuchsystem.getBewegungspunktekosten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y)
                End If
            End If
            If Spielfeld.AktuelleEinheit.Bewegungsart = MovementSorts.Hoellium.ToString Then
                If IsNothing(Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht)) = False Then
                    NeuObjektAnimation(New Point(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y), "Land", Objektverwalter.Spielfeld.MomentaneSchlacht)
                End If
            End If
            Spielfeld.AktuelleEinheit.X = Spielfeld.Laufen.Position.X
            Spielfeld.AktuelleEinheit.Y = Spielfeld.Laufen.Position.Y
            Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht) = Spielfeld.AktuelleEinheit
            Hauptmenue.CursorPlazieren(Spielfeld.Laufen.Position.X * Hauptmenue.Feldbreite, Spielfeld.Laufen.Position.Y * Hauptmenue.Feldbreite)
            Spielfeld.Laufen.UpdateSichtBereich()
            Spielfeld.LaufenLoeschen = True
        End If

        Spielfeld.AktuelleEinheit = Nothing
        Spielfeld.AktuelleEinheitPosition = Nothing
        Spielfeld.Wegsuchsystem = Nothing
        Spielfeld.AktuelleEinheitPfeil = Nothing
        Spielfeld.AktuelleEinheitHatGefeuert = False
        Spielfeld.Sichterstellen()
        Spielfeld.Regeln.CheckSieg()
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts
        ObjektScript.Pruefen(ObjektScript.Pruefstadien.RundenMitte)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    ''' <summary>
    ''' Laesst die ausgewaehlte Einheit warten und schickt sie auf das andere Schlachtfeld
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub Schicken()
        If Not Objektverwalter.Spielfeld.AktuelleEinheit Is Nothing Then
            If DataSettings.KonsolenSpielBefehle Then
                Konsole.Write("Send selected to Unit to other Battlefield.")
            End If
            'Wenn wir ein Netzwerkspiel haben, muss das auch gesendet werden.

            If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                Dim Befehl As New KINetzwerkBefehl
                Befehl.Befehl = ObjektKI.KIModiExtern.EinheitSchicken
                Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
                Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
                If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                    Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                    Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
                Else
                    Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                    Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
                End If
                Befehl.OpferX = Befehl.WegX(0)
                Befehl.OpferY = Befehl.WegY(0)
                Befehl.AngreiferSchaden = -1
                Befehl.Verteidigerschaden = -1
                Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
                Hauptmenue.NetzBefehlSenden(Befehl)
            End If

            'Wir legen die Feldtarnung fest.

            DoExtraActions()

            If IsNothing(Spielfeld.Laufen) Then
                MarkierteFelder.Clear()
                Spielfeld.AktuelleEinheit.HatsichBewegt = True
                Dim Map As Integer = Spielfeld.AktuelleEinheit.GetSendeMap
                Spielfeld.Einheiten(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.AktuelleEinheit.GetMap) = Nothing
                Spielfeld.AktuelleEinheit.Battlemap = Map
                Spielfeld.Einheiten(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Map) = Spielfeld.AktuelleEinheit
                Hauptmenue.CursorPlazieren(Spielfeld.AktuelleEinheitPosition.X * Hauptmenue.Feldbreite, Spielfeld.AktuelleEinheitPosition.Y * Hauptmenue.Feldbreite)
            Else
                If Spielfeld.AktuelleEinheit.Besetzen = True Then
                    If IsNothing(Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebaeude) = False Then
                        If IsNothing(Spielfeld.Landschaften(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).Gebaeude) Then
                            Spielfeld.AktuelleEinheit.Besetzen = False
                            Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebaeude.Besetzung = 20
                        Else
                            Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebaeude.Besetzung = 20
                        End If
                    End If
                End If
                If Spielfeld.Regeln.Nebel = Nebelarten.Aus Then
                    If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                        Spielfeld.AktuelleEinheit.Treibstoff = -Objektverwalter.Spielfeld.AktuelleEinheitPfeil.TreibstoffVerbrauch
                    Else
                        Spielfeld.AktuelleEinheit.Treibstoff = -Spielfeld.Wegsuchsystem.getBewegungspunktekosten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y)
                    End If
                End If
                If Spielfeld.AktuelleEinheit.Bewegungsart = MovementSorts.Hoellium.ToString Then
                    If IsNothing(Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht)) = False Then
                        NeuObjektAnimation(New Point(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y), "Land", Objektverwalter.Spielfeld.MomentaneSchlacht)
                    End If
                End If
                Spielfeld.AktuelleEinheit.X = Spielfeld.Laufen.Position.X
                Spielfeld.AktuelleEinheit.Y = Spielfeld.Laufen.Position.Y
                Spielfeld.AktuelleEinheit.HatsichBewegt = True
                Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.AktuelleEinheit.GetSendeMap) = Spielfeld.AktuelleEinheit
                Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.AktuelleEinheit.GetSendeMap).Battlemap = Spielfeld.AktuelleEinheit.GetSendeMap
                Hauptmenue.CursorPlazieren(Spielfeld.Laufen.Position.X * Hauptmenue.Feldbreite, Spielfeld.Laufen.Position.Y * Hauptmenue.Feldbreite)
                Spielfeld.Laufen.UpdateSichtBereich()
                Spielfeld.LaufenLoeschen = True
            End If

            Spielfeld.AktuelleEinheit = Nothing
            Spielfeld.AktuelleEinheitPosition = Nothing
            Spielfeld.Wegsuchsystem = Nothing
            Spielfeld.AktuelleEinheitPfeil = Nothing
            Spielfeld.AktuelleEinheitHatGefeuert = False
        End If
        Spielfeld.Sichterstellen()
        Spielfeld.Regeln.CheckSieg()
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts
        ObjektScript.Pruefen(ObjektScript.Pruefstadien.RundenMitte)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    Public Shared Sub Besetzen()
        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Capture Building with selected Unit")
        End If

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Besetzen
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = Befehl.WegX(0)
            Befehl.OpferY = Befehl.WegY(0)
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If

        If IsNothing(Spielfeld.Laufen) Then
            Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebaeude.Besetzen(Spielfeld.AktuelleEinheit)
        Else
            Spielfeld.Landschaften(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).Gebaeude.Besetzen(Spielfeld.AktuelleEinheit)
        End If
        Warten()
    End Sub
    Public Shared Sub Tarnen()
        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Hide selected Unit.")
        End If

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Tarnen
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = Befehl.WegX(0)
            Befehl.OpferY = Befehl.WegY(0)
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If

        Spielfeld.AktuelleEinheit.SetTarnung(True)
        Warten()
    End Sub
    Public Shared Sub Auftauchen()
        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Unhide selected Unit")
        End If

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Auftauchen
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = Befehl.WegX(0)
            Befehl.OpferY = Befehl.WegY(0)
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If

        Spielfeld.AktuelleEinheit.SetTarnung(False)
        Warten()
    End Sub
    Public Shared Sub Fracht()
        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Load Unit in other Unit")
        End If

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Fracht
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = Befehl.WegX(0)
            Befehl.OpferY = Befehl.WegY(0)
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If

        DoExtraActions()


        If Spielfeld.AktuelleEinheit.Besetzen = True Then
            If IsNothing(Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebaeude) = False Then
                If Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebaeude.Besetzung > 0 Then
                    If IsNothing(Spielfeld.Landschaften(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).Gebaeude) Then
                        Spielfeld.AktuelleEinheit.Besetzen = False
                        Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebaeude.Besetzung = 20
                    Else
                        Spielfeld.Landschaften(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht).Gebaeude.Besetzung = 20
                    End If
                End If
            End If
        End If
        Spielfeld.AktuelleEinheit.HatsichBewegt = True
        Dim FrachtEinheit As ObjektEinheit = Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht)
        For I = 0 To FrachtEinheit.Ladung.Length - 1
            If IsNothing(FrachtEinheit.Ladung(I)) Then
                FrachtEinheit.Ladung(I) = Spielfeld.AktuelleEinheit
                Exit For
            End If
        Next
        Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht) = FrachtEinheit
        Spielfeld.Laufen.UpdateSichtBereich()
        Spielfeld.LaufenLoeschen = True
        Spielfeld.AktuelleEinheit = Nothing
        Spielfeld.AktuelleEinheitPosition = Nothing
        Spielfeld.Wegsuchsystem = Nothing
        Spielfeld.AktuelleEinheitPfeil = Nothing
        MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Overworld\Geladen.wav", False)
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts
        ObjektScript.Pruefen(ObjektScript.Pruefstadien.RundenMitte)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    Public Shared Sub Angriffanzeigen()
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        M.Spielmodus = ObjektSpielMenue.Spielmodi.Angriff
        MarkierteFelder.Clear()
        Dim MaximalReichweite As Integer = -1
        Dim Kreis(,) As Integer
        Dim XPosition As Integer = Spielfeld.AktuelleEinheitPosition.X
        Dim YPosition As Integer = Spielfeld.AktuelleEinheitPosition.Y
        If IsNothing(Spielfeld.Laufen) = False Then
            XPosition = Spielfeld.Laufen.Position.X
            YPosition = Spielfeld.Laufen.Position.Y
        End If
        MaximalReichweite = Spielfeld.AktuelleEinheit.MaximaleReichweite

        Kreis = Kreisfunktion(MaximalReichweite)
        For X = 0 To Kreis.GetLength(0) - 1
            For Y = 0 To Kreis.GetLength(1) - 1
                If Kreis(X, Y) >= Spielfeld.AktuelleEinheit.MinimaleReichweite Then
                    Dim Fernkampf As Boolean = False
                    If Kreis(X, Y) > 1 Then
                        Fernkampf = True
                    End If
                    If KannAngreifen(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, XPosition, YPosition, Fernkampf, Spielfeld.AktuelleEinheit.GetMap) Then
                        neuMarkiertesFeld(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Color.FromArgb(160, 255, 255, 255), "Rot")
                    End If
                ElseIf Not Spielfeld.AktuelleEinheit.Waffe1 = "Keine" And Kreis(X, Y) > 0 Then
                    Dim Fernkampf As Boolean = False
                    If Kreis(X, Y) > 1 Then
                        Fernkampf = True
                    End If
                    If KannAngreifen(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, XPosition, YPosition, Fernkampf, Spielfeld.AktuelleEinheit.GetMap) Then
                        neuMarkiertesFeld(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Color.FromArgb(160, 255, 255, 255), "Rot")
                    End If
                ElseIf Kreis(X, Y) = 0 Then
                    'Wir sind eine Lufteinheit
                    If Spielfeld.AktuelleEinheit.GetMap = ObjektSpielfeld.Luftschlacht Then
                        If KannBodenAngriff(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, XPosition, YPosition) Then
                            neuMarkiertesFeld(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Color.FromArgb(160, 255, 255, 255), "Rot")
                        End If
                    End If
                End If
            Next
        Next

        Hauptmenue.CursorPlazieren(Objektverwalter.MarkierteFelder(0).X * Hauptmenue.Feldbreite, Objektverwalter.MarkierteFelder(0).Y * Hauptmenue.Feldbreite)
    End Sub
    Public Shared Sub LeuchtraketenZieleAbfeuern()
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        M.Spielmodus = ObjektSpielMenue.Spielmodi.Leuchtrakete
        MarkierteFelder.Clear()
        Dim MaximalReichweite As Integer = -1
        Dim Kreis(,) As Integer
        Dim XPosition As Integer = Spielfeld.AktuelleEinheitPosition.X
        Dim YPosition As Integer = Spielfeld.AktuelleEinheitPosition.Y
        If IsNothing(Spielfeld.Laufen) = False Then
            XPosition = Spielfeld.Laufen.Position.X
            YPosition = Spielfeld.Laufen.Position.Y
        End If
        MaximalReichweite = Spielfeld.AktuelleEinheit.Reichweitemax
        Kreis = Kreisfunktion(MaximalReichweite)
        For X = 0 To Kreis.GetLength(0) - 1
            For Y = 0 To Kreis.GetLength(1) - 1
                If Kreis(X, Y) >= 0 Then
                    neuMarkiertesFeld(XPosition - MaximalReichweite + X, YPosition - MaximalReichweite + Y, Color.FromArgb(160, 255, 255, 255), "Rot")
                End If
            Next
        Next
        Hauptmenue.CursorPlazieren(Objektverwalter.MarkierteFelder(0).X * Hauptmenue.Feldbreite, Objektverwalter.MarkierteFelder(0).Y * Hauptmenue.Feldbreite)
    End Sub
    Public Shared Function KannAngreifen(ByVal X As Integer, ByVal Y As Integer, ByVal AngreiferX As Integer, ByVal AngreiferY As Integer, ByVal Fernkampf As Boolean, ByVal Schlacht As Integer) As Boolean
        Dim Angreifer As ObjektEinheit = Spielfeld.Einheiten(AngreiferX, AngreiferY, Schlacht)
        If IsNothing(Angreifer) Then
            Angreifer = Spielfeld.AktuelleEinheit
        End If
        If Spielfeld.OnMap(X, Y) Then
            If IsNothing(Spielfeld.Einheiten(X, Y, Angreifer.GetMap)) = False Then
                If Not Spielfeld.Spieler(Spielfeld.Einheiten(X, Y, Angreifer.GetMap).Spieler).Team = Spielfeld.Spieler(Angreifer.Spieler).Team Then
                    If Spielfeld.Einheiten(X, Y, Angreifer.GetMap).Sichtbar = True Then
                        Dim Dis As Integer = GetDistance(X, Y, AngreiferX, AngreiferY)
                        If (Spielfeld.Einheiten(X, Y, Angreifer.GetMap).IsGetaucht And Dis = 1 And Spielfeld.Einheiten(X, Y, Angreifer.GetMap).Bewegungsart = Angreifer.Bewegungsart) Or Not Spielfeld.Einheiten(X, Y, Angreifer.GetMap).IsGetaucht Then
                            If Objektverwalter.Spielfeld.Laufen Is Nothing Then
                                If Schadensberechnung(Angreifer, AngreiferX, AngreiferY, X, Y, 100, 100, False, False, -999, Nothing, False)(0) >= 0 Then
                                    Return True
                                End If
                            ElseIf Fernkampf Then
                                If Angreifer.CanIndirectMoveAndFire Then
                                    If Schadensberechnung(Angreifer, AngreiferX, AngreiferY, X, Y, 100, 100, False, False, -999, Nothing, False)(0) >= 0 Then
                                        Return True
                                    End If
                                End If
                            Else
                                If Schadensberechnung(Angreifer, AngreiferX, AngreiferY, X, Y, 100, 100, False, False, -999, Nothing, False)(0) >= 0 Then
                                    Return True
                                End If
                            End If
                        End If
                    End If
                End If
            ElseIf Spielfeld.Landschaften(X, Y, Angreifer.GetMap).Leben > 0 Then
                If Schadensberechnung(Angreifer, AngreiferX, AngreiferY, X, Y, 100, 100, False, False, -999, Nothing, False)(0) >= 0 Then
                    Return True
                End If
            ElseIf IsNothing(Spielfeld.Landschaften(X, Y, Angreifer.GetMap).Gebaeude) = False Then
                If Spielfeld.Landschaften(Spielfeld.Landschaften(X, Y, Angreifer.GetMap).Gebaeude.Rechteck.X, Spielfeld.Landschaften(X, Y, Angreifer.GetMap).Gebaeude.Rechteck.Y, Angreifer.GetMap).Gebaeude.GetKP(X, Y, False) > 0 Then
                    If Not Spielfeld.Spieler(Spielfeld.Landschaften(Spielfeld.Landschaften(X, Y, Angreifer.GetMap).Gebaeude.Rechteck.X, Spielfeld.Landschaften(X, Y, Angreifer.GetMap).Gebaeude.Rechteck.Y, Angreifer.GetMap).Gebaeude.Spieler).Team = Spielfeld.Spieler(Spielfeld.AktuelleEinheit.Spieler).Team Then

                        If Schadensberechnung(Angreifer, AngreiferX, AngreiferY, X, Y, 100, 100, False, False, -999, Nothing, False)(0) >= 0 Then
                            Return True
                        End If
                    End If
                End If
            End If
        End If
        Return False
    End Function
    ''' <summary>
    ''' Ueberprueft ob eine Lufteinheit in der Luftschlacht einen Feind angreifen kann.
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="AngreiferX"></param>
    ''' <param name="AngreiferY"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function KannBodenAngriff(ByVal X As Integer, ByVal Y As Integer, ByVal AngreiferX As Integer, ByVal AngreiferY As Integer) As Boolean
        Dim Angreifer As ObjektEinheit = Spielfeld.Einheiten(AngreiferX, AngreiferY, ObjektSpielfeld.Luftschlacht)
        If IsNothing(Angreifer) Then
            Angreifer = Spielfeld.AktuelleEinheit
        End If
        Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht)
        If Not E Is Nothing Then
            If Not E.IsFlyingUnit Then
                If Not Spielfeld.Spieler(E.Spieler).Team = Spielfeld.Spieler(Angreifer.Spieler).Team Then
                    If E.Sichtbar = True Then
                        If Angreifer.IsAttackable(E, True) Then
                            Return True
                        End If
                    End If
                End If
            End If
        End If
        Return False
    End Function
    Public Shared Sub Entladen(ByVal X As Integer, ByVal Y As Integer, ByVal ZuentladendeEinheit As Integer)
        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Unload Unit at X=" + X.ToString + ", Y=" + Y.ToString)
        End If

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Entladen
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = X
            Befehl.OpferY = Y
            Befehl.AngreiferSchaden = ZuentladendeEinheit
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If
        Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht) = Spielfeld.AktuelleEinheit.Ladung(ZuentladendeEinheit)
        Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).SetFeldtarnung(False)
        Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).Battlemap = Spielfeld.AktuelleEinheit.Battlemap
        'Sollte jetzt je nach Version ohne diesen Aufruf funktionieren.
        ' Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).HatsichBewegt = True
        Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).X = X
        Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).Y = Y
        Spielfeld.AktuelleEinheit.Ladung(ZuentladendeEinheit) = Nothing
        MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Overworld\Entladen.wav", False)
        Dim EinheitGefunden As Boolean = False
        For I = 0 To Spielfeld.AktuelleEinheit.Ladung.Length - 1
            If IsNothing(Spielfeld.AktuelleEinheit.Ladung(I)) Then
                For I2 = I + 1 To Spielfeld.AktuelleEinheit.Ladung.Length - 1
                    If IsNothing(Spielfeld.AktuelleEinheit.Ladung(I2)) = False Then
                        Spielfeld.AktuelleEinheit.Ladung(I) = Spielfeld.AktuelleEinheit.Ladung(I2)
                        Spielfeld.AktuelleEinheit.Ladung(I2) = Nothing
                        EinheitGefunden = True
                        Exit For
                    End If
                Next
            Else
                EinheitGefunden = True
            End If
        Next
        If EinheitGefunden = False Then
            Warten()
        ElseIf Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
            Spielfeld.AktuelleEinheitHatGefeuert = True
            Befehlsmenuerschaffen()
        End If
        ObjektScript.Pruefen(ObjektScript.Pruefstadien.RundenMitte)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If

    End Sub
    Public Shared Sub EntladungAnzeigen(ByVal Einheit As Integer)
        Dim X As Integer = 0
        Dim Y As Integer = 0
        If IsNothing(Spielfeld.Laufen) Then
            X = Spielfeld.AktuelleEinheitPosition.X
            Y = Spielfeld.AktuelleEinheitPosition.Y
        Else
            X = Spielfeld.Laufen.Position.X
            Y = Spielfeld.Laufen.Position.Y
        End If
        For I = 0 To 3
            Select Case I
                Case 0
                    Y -= 1
                Case 1
                    Y += 1
                    X += 1
                Case 2
                    Y += 1
                    X -= 1
                Case 3
                    Y -= 1
                    X -= 1
            End Select
            If Spielfeld.OnMap(X, Y) Then
                If Bewegungskosten(Spielfeld.AktuelleEinheit.Ladung(Einheit), Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).getID, Spielfeld.Regeln.Wetter, X, Y) > 0 And IsNothing(Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht)) Then
                    neuMarkiertesFeld(X, Y, Color.FromArgb(160, 255, 255, 255))
                End If
            End If
        Next
        Hauptmenue.CursorPlazieren(Objektverwalter.MarkierteFelder(0).X * Hauptmenue.Feldbreite, Objektverwalter.MarkierteFelder(0).Y * Hauptmenue.Feldbreite)
    End Sub
    Public Shared Sub Ration(ByVal OhneWarten As Boolean, ByRef WarteZeit As Integer, ByVal Schlacht As Integer)
        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Give Ration to near Units.")
        End If

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Ration
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = Befehl.WegX(0)
            Befehl.OpferY = Befehl.WegY(0)
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If


        Dim X As Integer = 0
        Dim Y As Integer = 0
        If IsNothing(Spielfeld.Laufen) Then
            X = Spielfeld.AktuelleEinheitPosition.X
            Y = Spielfeld.AktuelleEinheitPosition.Y
        Else
            X = Spielfeld.Laufen.Position.X
            Y = Spielfeld.Laufen.Position.Y
        End If
        Dim Zeit As Integer = WarteZeit
        For I = 0 To 3
            Select Case I
                Case 0
                    Y -= 1
                Case 1
                    Y += 1
                    X += 1
                Case 2
                    Y += 1
                    X -= 1
                Case 3
                    Y -= 1
                    X -= 1
            End Select
            If Spielfeld.OnMap(X, Y) Then
                If IsNothing(Spielfeld.Einheiten(X, Y, Schlacht)) = False Then
                    If Not Spielfeld.AktuelleEinheit Is Nothing Then
                        If Spielfeld.Einheiten(X, Y, Schlacht).Spieler = Spielfeld.AktuelleEinheit.Spieler Then
                            If Spielfeld.AktuelleEinheit.Faehigkeit = "RationSame" Then
                                If Spielfeld.Einheiten(X, Y, Spielfeld.AktuelleEinheit.GetMap).IsGroundUnit = Spielfeld.AktuelleEinheit.IsGroundUnit Or _
                                    Spielfeld.Einheiten(X, Y, Spielfeld.AktuelleEinheit.GetMap).IsFlyingUnit = Spielfeld.AktuelleEinheit.IsFlyingUnit Or _
                                    Spielfeld.Einheiten(X, Y, Spielfeld.AktuelleEinheit.GetMap).IsSeaUnit = Spielfeld.AktuelleEinheit.IsSeaUnit Then
                                    WarteZeit = Zeit
                                    Ration(X, Y, True, WarteZeit, Schlacht)
                                End If
                            Else
                                WarteZeit = Zeit
                                Ration(X, Y, True, WarteZeit, Schlacht)
                            End If
                        End If
                    End If
                End If
            End If
        Next
        If OhneWarten = False Then
            Warten()
        Else
            ObjektScript.Pruefen(ObjektScript.Pruefstadien.RundenMitte)
        End If
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    Public Shared Sub Ration(ByVal X As Integer, ByVal Y As Integer, ByVal MitRationsZeichen As Boolean, ByRef WarteZeit As Integer, ByVal Schlacht As Integer)
        If IsNothing(Spielfeld.Einheiten(X, Y, Schlacht)) = False Then
            If Not Spielfeld.Landschaften(X, Y, Schlacht).Hidden Then
                If MitRationsZeichen = True Then
                    If Spielfeld.Landschaften(X, Y, Schlacht).Kriegsnebel = Nebelarten.Aus Then
                        If Not Hauptmenue.Aufzeichnungsspulen Then
                            BackbufferSpiel.AddAnimation("Ration", WarteZeit, New Point(X, Y), True, Schlacht)
                            WarteZeit += ObjektSpielfeld.WarteZeitZwischenAnimationen
                        End If
                    End If
                End If
                Spielfeld.Einheiten(X, Y, Schlacht).Treibstoff = Spielfeld.Einheiten(X, Y, Schlacht).SpritMax + 1
                If Not Spielfeld.Einheiten(X, Y, Schlacht).HasMaterial Then
                    Spielfeld.Einheiten(X, Y, Schlacht).Munition = Spielfeld.Einheiten(X, Y, Schlacht).MunitionMax + 1
                End If
            End If
        End If
    End Sub
    Public Shared Sub Einen()
        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Join in Unit to another one.")
        End If

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Einen
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = Befehl.WegX(0)
            Befehl.OpferY = Befehl.WegY(0)
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If
        If Objektverwalter.Spielfeld.Laufen IsNot Nothing Then
            If Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht) IsNot Nothing Then
                Dim KP As Integer = (Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).getKP + Spielfeld.AktuelleEinheit.getKP) * 10

                If KP / 10 > 10 Then
                    Spielfeld.Spieler(Spielfeld.AktuelleEinheit.Spieler).AddFonds((Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).getKP + Spielfeld.AktuelleEinheit.getKP - 10) * Spielfeld.AktuelleEinheit.Kosten / 10 * Spielfeld.Spieler(Spielfeld.AktuelleEinheit.Spieler).Teurungsrate(Spielfeld.AktuelleEinheit, Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y))
                    KP = 100
                End If
                Dim Treibstoff As Integer = Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).Treibstoff + Spielfeld.AktuelleEinheit.Treibstoff
                Dim Muni As Integer = Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).Munition + Spielfeld.AktuelleEinheit.Munition
                Dim Rang As ObjektEinheit.Stufe = Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).EinheitenStufe
                If Rang < Spielfeld.AktuelleEinheit.EinheitenStufe Then
                    Rang = Spielfeld.AktuelleEinheit.EinheitenStufe
                End If
                Dim COEinheit As Boolean = False
                If Not Spielfeld.AktuellerSpieler.KOS(0).GetKOUnit Is Nothing Then
                    If Spielfeld.AktuelleEinheit.EinheitenStufe = ObjektEinheit.Stufe.KO Then
                        COEinheit = True
                    ElseIf Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).EinheitenStufe = ObjektEinheit.Stufe.KO Then
                        COEinheit = True
                    End If
                End If
                Spielfeld.AktuelleEinheit = ObjektLadeklasse.NewEinheit(Spielfeld.AktuelleEinheit.EinheitenID, KP, 0, Muni, Spielfeld.AktuelleEinheit.Spieler, Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht).Besetzen, Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, False, True)
                Spielfeld.AktuelleEinheit.Munition = Muni
                Spielfeld.AktuelleEinheit.Treibstoff = Treibstoff
                Spielfeld.AktuelleEinheit.TruppenStufe = Rang
                Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht) = Nothing
                If COEinheit Then
                    Spielfeld.AktuellerSpieler.KOS(0).SetKOEinheit(Spielfeld.AktuelleEinheit)
                End If
            End If
        End If
        Warten()
    End Sub
    Public Shared Sub Heilen(ByRef Einheit As ObjektEinheit, Optional ByVal Umsonst As Boolean = False)
        If Not Spielfeld.Landschaften(Einheit.X, Einheit.Y, Einheit.GetMap).Hidden Then
            If Umsonst = True Then
                Dim KP As Integer = Einheit.getKP
                If KP + 1 <= 10 Then
                    KP += 1
                End If
                Einheit.Leben = (KP) * 10
            Else
                If Einheit.Kosten / 10 * Spielfeld.Spieler(Einheit.Spieler).Teurungsrate(Einheit, Einheit.X, Einheit.Y) * Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).VeraenderteWerte.Reperaturkosten <= Spielfeld.Spieler(Einheit.Spieler).Fonds Then
                    Dim KP As Integer = Einheit.getKP
                    If KP + 1 <= 10 Then
                        Spielfeld.Spieler(Einheit.Spieler).AddFonds(-Einheit.Kosten / 10 * Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).VeraenderteWerte.Reperaturkosten)
                        KP += 1
                    End If
                    Einheit.Leben = (KP) * 10
                End If
            End If
        End If
    End Sub
    Public Shared Sub EinheitBauen(ByVal Daten() As String, ByVal X As Integer, ByVal Y As Integer, Optional ByVal HatSichBewegt As Boolean = True, Optional ByVal KIBau As Boolean = False)
        If Objektverwalter.Spielfeld.AktuellerSpieler.VeraenderteWerte.KeinBau = False Then

            Dim Einheitenname As String = Daten(0)
            If Daten.Length > 2 Then
                For I = 1 To Daten.Length - 2
                    If Not Daten(I) = "" Then
                        Einheitenname += " " + Daten(I)
                    End If
                Next
            End If

            If DataSettings.KonsolenSpielBefehle Then
                Konsole.Write("Build " + Sprachconverter.Translate(Einheitenname) + " at X=" + X.ToString + ", Y=" + Y.ToString)
            End If

            Dim EinheitID As String = ObjektLadeklasse.GetIDFromName(Einheitenname)

            If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                Hauptmenue.User.UnitBuild(EinheitID)
            End If

            If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                Dim Befehl As New KINetzwerkBefehl
                Befehl.Befehl = ObjektKI.KIModiExtern.EinheitBauen
                Befehl.KooX = X
                Befehl.KooY = Y
                Dim ID As Integer = -1
                For I = 0 To Objektverwalter.AlleEinheiten.Length - 1
                    If Objektverwalter.AlleEinheiten(I).EinheitenID = EinheitID Then
                        ID = I
                        Exit For
                    End If
                Next
                Befehl.WegX = New Integer() {ID}
                Befehl.WegY = New Integer() {HatSichBewegt}
                Befehl.OpferX = X
                Befehl.OpferY = Y
                Befehl.AngreiferSchaden = -1
                Befehl.Verteidigerschaden = -1
                Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
                Hauptmenue.NetzBefehlSenden(Befehl)
            End If

            If Spielfeld.AktuellerSpieler.KOS(0).KOBoostApply(X, Y) Then
                If Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).NachBauZiehen = True Then
                    HatSichBewegt = False
                End If
            End If
            Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht) = ObjektLadeklasse.NewEinheit(EinheitID, Spielfeld.AktuellerSpieler.Spieler, X, Y, HatSichBewegt)
            Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).Sichtbar = False
            If Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).KannTarnen Then
                Select Case Spielfeld.GetCommanderWarsModus
                    Case CommanderWarsGameModi.AdvanceWarsDC
                        Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).SetTarnung(True)
                    Case CommanderWarsGameModi.CommanderWars2
                        Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).SetTarnung(True)
                    Case Else
                        Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).SetTarnung(False)
                End Select
            End If
            Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).SetKP(Objektverwalter.Spielfeld.AktuellerSpieler.VeraenderteWerte.TPBauEinheiten)
            Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht).Battlemap = Spielfeld.MomentaneSchlacht
            Spielfeld.Regeln.SindBesiegbar()
            'Wir muessen die Einheit bezahlen
            Spielfeld.AktuellerSpieler.AddFonds(-Daten(Daten.Length - 1))
            If KIBau = False Then
                MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\OK.wav", False)
                Dim M As ObjektSpielMenue = Objektverwalter.Menue
                M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts
            End If
        End If
        ObjektScript.Pruefen(ObjektScript.Pruefstadien.RundenMitte)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
        'Wir haben noch eine Truppe gemacht
        Objektverwalter.Spielfeld.Aufzeichnung.DeployedUnits(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler - 1) += 1
        Objektverwalter.Spielfeld.Sichterstellen()
        Objektverwalter.Spielfeld.Regeln.CheckSieg()
    End Sub
    Public Shared Sub EinheitBauenFlugzeugtraeger(ByVal Daten() As String, ByVal X As Integer, ByVal Y As Integer, Optional ByVal HatSichBewegt As Boolean = True, Optional ByVal KIBau As Boolean = False)
        If Objektverwalter.Spielfeld.AktuellerSpieler.VeraenderteWerte.KeinBau = False Then
            Dim Einheitenname As String = Daten(0)
            If Daten.Length > 2 Then
                For I = 1 To Daten.Length - 2
                    If Not Daten(I) = "" Then
                        Einheitenname += " " + Daten(I)
                    End If
                Next
            End If

            If DataSettings.KonsolenSpielBefehle Then
                Konsole.Write("Build " + Sprachconverter.Translate(Einheitenname) + " inside other Unit at X=" + X.ToString + ", Y=" + Y.ToString)
            End If

            Dim EinheitID As String = ObjektLadeklasse.GetIDFromName(Einheitenname)

            If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                Dim Befehl As New KINetzwerkBefehl
                Befehl.Befehl = ObjektKI.KIModiExtern.FlugzeugtraegerBau
                Befehl.KooX = X
                Befehl.KooY = Y
                Dim ID As Integer = -1
                For I = 0 To Objektverwalter.AlleEinheiten.Length - 1
                    If Objektverwalter.AlleEinheiten(I).EinheitenID = EinheitID Then
                        ID = I
                        Exit For
                    End If
                Next
                If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                    Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                    Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
                Else
                    Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                    Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
                End If
                Befehl.OpferX = Befehl.WegX(0)
                Befehl.OpferY = Befehl.WegY(0)
                Befehl.AngreiferSchaden = ID
                Befehl.Verteidigerschaden = HatSichBewegt
                Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
                Hauptmenue.NetzBefehlSenden(Befehl)
            End If

            HatSichBewegt = True
            Dim E As ObjektEinheit
            E = ObjektLadeklasse.NewEinheit(EinheitID, Spielfeld.AktuellerSpieler.Spieler, X, Y, HatSichBewegt)
            E.SetKP(Objektverwalter.Spielfeld.AktuellerSpieler.VeraenderteWerte.TPBauEinheiten)
            E.Battlemap = Objektverwalter.Spielfeld.AktuelleEinheit.Battlemap
            For I = 0 To Objektverwalter.Spielfeld.AktuelleEinheit.Ladung.Length - 1
                If Objektverwalter.Spielfeld.AktuelleEinheit.Ladung(I) Is Nothing Then
                    Objektverwalter.Spielfeld.AktuelleEinheit.Ladung(I) = E
                    Exit For
                End If
            Next
            If DataSettings.CommanderWarsGameModus = CommanderWarsGameModi.AdvanceWarsDC Then
                Objektverwalter.Spielfeld.AktuelleEinheit.Munition -= 1
            End If
            Spielfeld.Regeln.SindBesiegbar()
            'Wir muessen die Einheit bezahlen
            Spielfeld.AktuellerSpieler.AddFonds(-Daten(Daten.Length - 1))
            If KIBau = False Then
                MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\OK.wav", False)
                Dim M As ObjektSpielMenue = Objektverwalter.Menue
                M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts
            End If
            Warten()
        End If
        ObjektScript.Pruefen(ObjektScript.Pruefstadien.RundenMitte)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
        'Wir haben noch eine Truppe gemacht
        Objektverwalter.Spielfeld.Aufzeichnung.DeployedUnits(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler - 1) += 1
        Objektverwalter.Spielfeld.Regeln.CheckSieg()
    End Sub
    Public Shared Sub SiloZuenden(ByVal X As Integer, ByVal Y As Integer)

        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Fire Missile at X=" + X.ToString + ", Y=" + Y.ToString)
        End If

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            Befehl.Befehl = ObjektKI.KIModiExtern.SiloZuenden
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = X
            Befehl.OpferY = Y
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If

        'Wir Feuern jetzt eine Rakete in das Zielgebiet Bumm
        Dim X1, Y1 As Integer
        If IsNothing(Spielfeld.Laufen) Then
            X1 = Spielfeld.AktuelleEinheitPosition.X : Y1 = Spielfeld.AktuelleEinheitPosition.Y
        Else
            X1 = Spielfeld.Laufen.Position.X : Y1 = Spielfeld.Laufen.Position.Y
        End If
        If IsNothing(Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).Gebaeude) = False Then
            Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).Gebaeude = ObjektLadeklasse.NewGebaeude(Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).Gebaeude.WirdZu, Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).Gebaeude.Spieler, X1, Y1, Nothing)
        End If
        'die Rakete wird abgefeuert und eine Animation abgespielt.=)
        'Objektverwalter.NeuObjektAnimation(New Point(X, Y), "SILOEXPLOSION+KLEIN")
        Explosion(X, Y, 2, 3, "LAND", ObjektSpielfeld.Bodenschlacht)
        Warten()
    End Sub
    Public Shared Sub Reparieren(ByVal X As Integer, ByVal Y As Integer)

        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Repair Unit at X=" + X.ToString + ", Y=" + Y.ToString)
        End If


        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Reparieren
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = X
            Befehl.OpferY = Y
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If

        Heilen(Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht))
        Ration(X, Y, False, 2, Spielfeld.MomentaneSchlacht)
        MarkierteFelder.Clear()
        NeuObjektAnimation(X, Y, "Ration", "")
        Warten()
    End Sub
    Public Shared Sub ReparierenAnzeigen()
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        M.Spielmodus = ObjektSpielMenue.Spielmodi.Reparieren
        Dim Feld As Point
        If IsNothing(Spielfeld.Laufen) Then
            Feld = New Point(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y)
        Else
            Feld = New Point(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y)
        End If
        For I = 0 To 3
            Select Case I
                Case 0
                    Feld.Y -= 1
                Case 1
                    Feld.Y += 1
                    Feld.X += 1
                Case 2
                    Feld.Y += 1
                    Feld.X -= 1
                Case 3
                    Feld.Y -= 1
                    Feld.X -= 1
            End Select
            If Spielfeld.OnMap(Feld.X, Feld.Y) Then
                If Not Spielfeld.Landschaften(Feld.X, Feld.Y, Spielfeld.MomentaneSchlacht).Hidden Then
                    If IsNothing(Spielfeld.Einheiten(Feld.X, Feld.Y, Spielfeld.MomentaneSchlacht)) = False Then
                        If Spielfeld.Einheiten(Feld.X, Feld.Y, Spielfeld.MomentaneSchlacht).Spieler = Spielfeld.AktuelleEinheit.Spieler Then
                            neuMarkiertesFeld(Feld.X, Feld.Y, Color.FromArgb(160, 255, 255, 255))
                        End If
                    End If
                End If
            End If
        Next
        Hauptmenue.CursorPlazieren(Objektverwalter.MarkierteFelder(0).X * Hauptmenue.Feldbreite, Objektverwalter.MarkierteFelder(0).Y * Hauptmenue.Feldbreite)
    End Sub
    Public Shared Sub Explosion()

        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Explode Unit through skill.")
        End If

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Explosion
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = Befehl.WegX(0)
            Befehl.OpferY = Befehl.WegY(0)
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If

        If IsNothing(Spielfeld.Laufen) Then
            Explosion(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, 3, 5, "LAND", Spielfeld.AktuelleEinheit.GetMap, "BOMBE")
            Spielfeld.Einheiten(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht) = Nothing
        Else
            Explosion(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, 3, 5, "LAND", Spielfeld.AktuelleEinheit.GetMap, "BOMBE")
        End If
        Spielfeld.Laufen.UpdateSichtBereich()
        Spielfeld.LaufenLoeschen = True
        Spielfeld.AktuelleEinheit = Nothing
        Spielfeld.AktuelleEinheitPfeil = Nothing
        Spielfeld.AktuelleEinheitPosition = Nothing
        Spielfeld.Wegsuchsystem = Nothing
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts
        ObjektScript.Pruefen(ObjektScript.Pruefstadien.RundenMitte)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    Public Shared Sub Explosion(ByVal X As Integer, ByVal Y As Integer, ByVal Reichweite As Integer, ByVal Schaden As Integer, ByVal ExplosionsArt As String, ByVal Schlacht As Integer, Optional ByVal ExplosionMitte As String = "")
        Dim Kreis(,) As Integer = {}
        Kreis = Kreisfunktion(Reichweite)
        For X1 = 0 To Kreis.GetLength(0) - 1
            For Y1 = 0 To Kreis.GetLength(1) - 1
                If Kreis(X1, Y1) >= 0 Then
                    If Spielfeld.OnMap(X - Reichweite + X1, Y - Reichweite + Y1) Then
                        DoDamage(X - Reichweite + X1, Y - Reichweite + Y1, Schaden, Schlacht)
                    End If
                End If
            Next
        Next
        ObjektLadeklasse.SiloExplosion(Reichweite, ExplosionsArt, X, Y, Schlacht, ExplosionMitte)
    End Sub
    Public Shared Sub DoDamage(ByVal X As Integer, ByVal Y As Integer, ByVal Schaden As Integer, ByVal Schlacht As Integer)
        If Spielfeld.OnMap(X, Y) Then
            If Not Spielfeld.Landschaften(X, Y, Schlacht).Hidden Then
                If IsNothing(Spielfeld.Einheiten(X, Y, Schlacht)) = False Then
                    Dim KP As Integer = Spielfeld.Einheiten(X, Y, Schlacht).getKP - Schaden
                    If KP <= 0 Then
                        If Spielfeld.Regeln.GebaeudeZerstoerung Then
                            NeuObjektAnimation(X, Y)
                            Spielfeld.Einheiten(X, Y, Schlacht) = Nothing
                        Else
                            Spielfeld.Einheiten(X, Y, Schlacht).Leben = 1
                        End If
                    Else
                        If KP > 10 Then KP = 10
                        Spielfeld.Einheiten(X, Y, Schlacht).Leben = KP * 10
                    End If
                End If
            End If
        End If
    End Sub
    ''' <summary>
    ''' erstellt ein Menue in dem Preis und Gebaeude aufgelistet sind, die gebaut werden koennen.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub GebaeudeBauMenuerschaffen(ByVal X As Integer, ByVal Y As Integer)
        Dim Landschaft As String = Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).getID
        Dim Namen As New Stack(Of String)
        Dim Symbole As New Stack(Of Texture)
        Dim Enabled As New Stack(Of Boolean)
        Dim SymbolMasken As New Stack(Of Texture)
        'Wenn man Material hat kann man bauen?
        If Spielfeld.AktuelleEinheit.HasMaterial Then
            If Spielfeld.AktuelleEinheit.Munition <= 0 Then
                Exit Sub
            End If
        End If
        Dim F As Bitmap = Hauptmenue.Farbtabelleerstellen(Objektverwalter.Spielfeld.AktuellerSpieler.Farbe)
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht Then
            If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Luftschlacht).getID = "LUFT" Then
                'Die Minigeschuetz werden hinzugefuegt.
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("FLIEGENDESMINIGESCHUETZ+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    addMenueitem("Fliegendes_Minigeschuetz_Nord_bauen " + ObjektLadeklasse.GetGebaeudeKosten("FLIEGENDESMINIGESCHUETZ+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+N.png"), F), Symbole, Namen, False, Enabled, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+N+Maske.png")), SymbolMasken)
                Else
                    addMenueitem("Fliegendes_Minigeschuetz_Nord_bauen " + ObjektLadeklasse.GetGebaeudeKosten("FLIEGENDESMINIGESCHUETZ+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+N.png"), F), Symbole, Namen, True, Enabled, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+N+Maske.png")), SymbolMasken)
                End If
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("FLIEGENDESMINIGESCHUETZ+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    addMenueitem("Fliegendes_Minigeschuetz_Ost_bauen " + ObjektLadeklasse.GetGebaeudeKosten("FLIEGENDESMINIGESCHUETZ+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+O.png"), F), Symbole, Namen, False, Enabled, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+O+Maske.png")), SymbolMasken)
                Else
                    addMenueitem("Fliegendes_Minigeschuetz_Ost_bauen " + ObjektLadeklasse.GetGebaeudeKosten("FLIEGENDESMINIGESCHUETZ+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+O.png"), F), Symbole, Namen, True, Enabled, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+O+Maske.png")), SymbolMasken)
                End If
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("FLIEGENDESMINIGESCHUETZ+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    addMenueitem("Fliegendes_Minigeschuetz_Sued_bauen " + ObjektLadeklasse.GetGebaeudeKosten("FLIEGENDESMINIGESCHUETZ+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+S.png"), F), Symbole, Namen, False, Enabled, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+S+Maske.png")), SymbolMasken)
                Else
                    addMenueitem("Fliegendes_Minigeschuetz_Sued_bauen " + ObjektLadeklasse.GetGebaeudeKosten("FLIEGENDESMINIGESCHUETZ+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+S.png"), F), Symbole, Namen, True, Enabled, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+S+Maske.png")), SymbolMasken)
                End If
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("FLIEGENDESMINIGESCHUETZ+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    addMenueitem("Fliegendes_Minigeschuetz_West_bauen " + ObjektLadeklasse.GetGebaeudeKosten("FLIEGENDESMINIGESCHUETZ+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+W.png"), F), Symbole, Namen, False, Enabled, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+W+Maske.png")), SymbolMasken)
                Else
                    addMenueitem("Fliegendes_Minigeschuetz_West_bauen " + ObjektLadeklasse.GetGebaeudeKosten("FLIEGENDESMINIGESCHUETZ+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+W.png"), F), Symbole, Namen, True, Enabled, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+W+Maske.png")), SymbolMasken)
                End If
                If KannGebaeudeLuftplaziertwerden(X, Y, "FLIEGENDEFESTUNG") Then
                    Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("FLIEGENDEFESTUNG")
                    Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                    If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("FLIEGENDEFESTUNG", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                        addMenueitem("Fliegende_Festung_bauen " + ObjektLadeklasse.GetGebaeudeKosten("FLIEGENDEFESTUNG", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                    Else
                        addMenueitem("Fliegende_Festung_bauen " + ObjektLadeklasse.GetGebaeudeKosten("FLIEGENDEFESTUNG", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                    End If
                End If
            End If
        End If
        'Mauern
        If KannBauen(X, Y, "MAUER") Then
            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("MAUER", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                addMenueitem("Mauer_bauen " + ObjektLadeklasse.GetGebaeudeKosten("MAUER", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\MAUER.png")), Symbole, Namen, False, Enabled, , SymbolMasken)
            Else
                addMenueitem("Mauer_bauen " + ObjektLadeklasse.GetGebaeudeKosten("MAUER", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\MAUER.png")), Symbole, Namen, True, Enabled, , SymbolMasken)
            End If
        End If
        'Bruecken
        If KannBauen(X, Y, "BRUECKE") Then
            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("BRUECKE", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                addMenueitem("Bruecke_bauen " + ObjektLadeklasse.GetGebaeudeKosten("BRUECKE", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\BauBruecke.png")), Symbole, Namen, False, Enabled)
            Else
                addMenueitem("Bruecke_bauen " + ObjektLadeklasse.GetGebaeudeKosten("BRUECKE", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\BauBruecke.png")), Symbole, Namen, True, Enabled)
            End If
        End If
        If ISBauuntergrund(Landschaft) = True Then
            'Der Kristall wird hinzugefuegt.
            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("KRISTALL", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                addMenueitem("Kristall_bauen " + ObjektLadeklasse.GetGebaeudeKosten("KRISTALL", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Kristall.png")), Symbole, Namen, False, Enabled, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Kristall+Maske.png")), SymbolMasken)
            Else
                addMenueitem("Kristall_bauen " + ObjektLadeklasse.GetGebaeudeKosten("KRISTALL", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Kristall.png")), Symbole, Namen, True, Enabled, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Kristall+Maske.png")), SymbolMasken)
            End If
            'Die Minigeschuetz werden hinzugefuegt.
            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("MINIGESCHUETZ+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                addMenueitem("Minigeschuetz_Nord_bauen " + ObjektLadeklasse.GetGebaeudeKosten("MINIGESCHUETZ+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+N.png")), Symbole, Namen, False, Enabled, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+N+Maske.png")), SymbolMasken)
            Else
                addMenueitem("Minigeschuetz_Nord_bauen " + ObjektLadeklasse.GetGebaeudeKosten("MINIGESCHUETZ+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+N.png")), Symbole, Namen, True, Enabled, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+N+Maske.png")), SymbolMasken)
            End If
            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("MINIGESCHUETZ+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                addMenueitem("Minigeschuetz_Ost_bauen " + ObjektLadeklasse.GetGebaeudeKosten("MINIGESCHUETZ+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+O.png")), Symbole, Namen, False, Enabled, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+O+Maske.png")), SymbolMasken)
            Else
                addMenueitem("Minigeschuetz_Ost_bauen " + ObjektLadeklasse.GetGebaeudeKosten("MINIGESCHUETZ+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+O.png")), Symbole, Namen, True, Enabled, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+O+Maske.png")), SymbolMasken)
            End If
            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("MINIGESCHUETZ+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                addMenueitem("Minigeschuetz_Sued_bauen " + ObjektLadeklasse.GetGebaeudeKosten("MINIGESCHUETZ+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+S.png")), Symbole, Namen, False, Enabled, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+S+Maske.png")), SymbolMasken)
            Else
                addMenueitem("Minigeschuetz_Sued_bauen " + ObjektLadeklasse.GetGebaeudeKosten("MINIGESCHUETZ+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+S.png")), Symbole, Namen, True, Enabled, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+S+Maske.png")), SymbolMasken)
            End If
            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("MINIGESCHUETZ+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                addMenueitem("Minigeschuetz_West_bauen " + ObjektLadeklasse.GetGebaeudeKosten("MINIGESCHUETZ+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+W.png")), Symbole, Namen, False, Enabled, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+W+Maske.png")), SymbolMasken)
            Else
                addMenueitem("Minigeschuetz_West_bauen " + ObjektLadeklasse.GetGebaeudeKosten("MINIGESCHUETZ+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+W.png")), Symbole, Namen, True, Enabled, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\Minigeschuetz+W+Maske.png")), SymbolMasken)
            End If
            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("LASER", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                addMenueitem("Laser_bauen " + ObjektLadeklasse.GetGebaeudeKosten("LASER", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\laser.png")), Symbole, Namen, False, Enabled, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\laser+maske.png")), SymbolMasken)
            Else
                addMenueitem("Laser_bauen " + ObjektLadeklasse.GetGebaeudeKosten("LASER", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\laser.png")), Symbole, Namen, True, Enabled, Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\laser+maske.png")), SymbolMasken)
            End If
            'So jetzt kommen die naechst groesseren Gebaeude mit drei auf drei Feldern ausdehnung.
            If KannGebaeudeplaziertwerden(X, Y, "SCHWARZE GESCHUETZ+N") Then
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("SCHWARZE GESCHUETZ+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("SCHWARZE GESCHUETZ+N")
                    Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                    addMenueitem("Schwarze_Geschuetz_Nord_bauen " + ObjektLadeklasse.GetGebaeudeKosten("SCHWARZE GESCHUETZ+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                Else
                    Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("SCHWARZE GESCHUETZ+N")
                    Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                    addMenueitem("Schwarze_Geschuetz_Nord_bauen " + ObjektLadeklasse.GetGebaeudeKosten("SCHWARZE GESCHUETZ+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                End If
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("SCHWARZE GESCHUETZ+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("SCHWARZE GESCHUETZ+O")
                    Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                    addMenueitem("Schwarze_Geschuetz_Ost_bauen " + ObjektLadeklasse.GetGebaeudeKosten("SCHWARZE GESCHUETZ+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                Else
                    Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("SCHWARZE GESCHUETZ+O")
                    Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                    addMenueitem("Schwarze_Geschuetz_Ost_bauen " + ObjektLadeklasse.GetGebaeudeKosten("SCHWARZE GESCHUETZ+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                End If
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("SCHWARZE GESCHUETZ+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("SCHWARZE GESCHUETZ+S")
                    Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                    addMenueitem("Schwarze_Geschuetz_Sued_bauen " + ObjektLadeklasse.GetGebaeudeKosten("SCHWARZE GESCHUETZ+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                Else
                    Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("SCHWARZE GESCHUETZ+S")
                    Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                    addMenueitem("Schwarze_Geschuetz_Sued_bauen " + ObjektLadeklasse.GetGebaeudeKosten("SCHWARZE GESCHUETZ+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                End If
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("SCHWARZE GESCHUETZ+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("SCHWARZE GESCHUETZ+W")
                    Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                    addMenueitem("Schwarze_Geschuetz_West_bauen " + ObjektLadeklasse.GetGebaeudeKosten("SCHWARZE GESCHUETZ+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                Else
                    Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("SCHWARZE GESCHUETZ+W")
                    Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                    addMenueitem("Schwarze_Geschuetz_West_bauen " + ObjektLadeklasse.GetGebaeudeKosten("SCHWARZE GESCHUETZ+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                End If
                'Jetzt die Schocklaser
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("SCHOCKLASER+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("SCHOCKLASER+N")
                    Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                    addMenueitem("Schocklaser_Nord_bauen " + ObjektLadeklasse.GetGebaeudeKosten("SCHOCKLASER+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                Else
                    Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("SCHOCKLASER+N")
                    Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                    addMenueitem("Schocklaser_Nord_bauen " + ObjektLadeklasse.GetGebaeudeKosten("SCHOCKLASER+N", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                End If
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("SCHOCKLASER+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("SCHOCKLASER+O")
                    Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                    addMenueitem("Schocklaser_Ost_bauen " + ObjektLadeklasse.GetGebaeudeKosten("SCHOCKLASER+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                Else
                    Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("SCHOCKLASER+O")
                    Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                    addMenueitem("Schocklaser_Ost_bauen " + ObjektLadeklasse.GetGebaeudeKosten("SCHOCKLASER+O", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                End If
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("SCHOCKLASER+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("SCHOCKLASER+O")
                    Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                    addMenueitem("Schocklaser_Sued_bauen " + ObjektLadeklasse.GetGebaeudeKosten("SCHOCKLASER+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                Else
                    Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("SCHOCKLASER+S")
                    Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                    addMenueitem("Schocklaser_Sued_bauen " + ObjektLadeklasse.GetGebaeudeKosten("SCHOCKLASER+S", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                End If
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("SCHOCKLASER+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("SCHOCKLASER+W")
                    Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                    addMenueitem("Schocklaser_West_bauen " + ObjektLadeklasse.GetGebaeudeKosten("SCHOCKLASER+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                Else
                    Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("SCHOCKLASER+W")
                    Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                    addMenueitem("Schocklaser_West_bauen " + ObjektLadeklasse.GetGebaeudeKosten("SCHOCKLASER+W", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                End If
                If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("MONOLITH", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                    Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("MONOLITH")
                    Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                    addMenueitem("Monolith_bauen " + ObjektLadeklasse.GetGebaeudeKosten("MONOLITH", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                Else
                    Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("MONOLITH")
                    Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                    Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                    addMenueitem("Monolith_bauen " + ObjektLadeklasse.GetGebaeudeKosten("MONOLITH", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                End If
                If KannGebaeudeplaziertwerden(X, Y, "OMEGARAKETE") Then
                    If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("OMEGARAKETE", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                        Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("OMEGARAKETE")
                        Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                        Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                        addMenueitem("Omega-Rakete_bauen " + ObjektLadeklasse.GetGebaeudeKosten("OMEGARAKETE", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                    Else
                        Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("OMEGARAKETE")
                        Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                        Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                        addMenueitem("Omega-Rakete_bauen  " + ObjektLadeklasse.GetGebaeudeKosten("OMEGARAKETE", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                    End If
                End If
                If KannGebaeudeplaziertwerden(X, Y, "FESTUNG") Then
                    If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("FESTUNG", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                        Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("FESTUNG")
                        Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                        Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                        addMenueitem("Festung_bauen " + ObjektLadeklasse.GetGebaeudeKosten("FESTUNG", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, False, Enabled, Maske, SymbolMasken)
                    Else
                        Dim I As Integer = Objektverwalter.GebaeudeTextur.GetGebaeudeID("FESTUNG")
                        Dim Symbol As Texture = Objektverwalter.AlleGebaeude(I).SymbolTextur
                        Dim Maske As Texture = Objektverwalter.AlleGebaeude(I).SymbolTexturMaske
                        addMenueitem("Festung_bauen " + ObjektLadeklasse.GetGebaeudeKosten("FESTUNG", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Symbol, Symbole, Namen, True, Enabled, Maske, SymbolMasken)
                    End If
                End If
            End If
        ElseIf Landschaft = "RAKETENSILO" Then
            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).Fonds >= ObjektLadeklasse.GetGebaeudeKosten("SILO", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) Then
                addMenueitem("Rakete_bauen " + ObjektLadeklasse.GetGebaeudeKosten("SILO", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Raketebauen.png"), Symbole, Namen, False, Enabled)
            Else
                addMenueitem("Rakete_bauen " + ObjektLadeklasse.GetGebaeudeKosten("SILO", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler).ToString, Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Raketebauen.png"), Symbole, Namen, True, Enabled)
            End If
        End If
        If Namen.Count > 0 Then
            If (DataSettings._2D_3D_Malen Or DataSettings.draw3D) Then
                EinheitenMenue = New ObjektEinheitenmenue(Namen.ToArray, Symbole.ToArray, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, Hauptmenue.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, False, Enabled.ToArray, False, True, ObjektEinheitenmenue.Modi.Gebaeudebauen, SymbolMasken.ToArray)
            Else
                EinheitenMenue = New ObjektEinheitenmenue(Namen.ToArray, Symbole.ToArray, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, Hauptmenue.Feldbreite, X * Hauptmenue.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooX, Y * Hauptmenue.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooY, False, Enabled.ToArray, False, True, ObjektEinheitenmenue.Modi.Gebaeudebauen, SymbolMasken.ToArray)
            End If
        End If
    End Sub
    ''' <summary>
    ''' Ueberprueft ob wir eine Mauer oder Bruecke bauen koennen
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="ID"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Shared Function KannBauen(ByVal X As Integer, ByVal Y As Integer, ByVal ID As String) As Boolean
        Dim X2 As Integer = X
        Dim Y2 As Integer = Y
        Dim P As New Point(X, Y)
        Dim Untergund As String() = {}
        Select Case ID
            Case "BRUECKE"
                Untergund = New String() {"FLUSS", "SEE"}
            Case "MAUER"
                Untergund = New String() {"EBENE", "EBENE+SCHROTT", "STRASSE", "SCHNEE", "SCHNEE+SCHROTT", "WUESTE", "WUESTE+SCHROTT", "PFAD", "STRASSENFROST"}
        End Select
        For I = 0 To 3
            Select Case I
                Case 0
                    X2 -= 1
                Case 1
                    X2 += 1
                    Y2 -= 1
                Case 2
                    X2 += 1
                    Y2 += 1
                Case 3
                    X2 -= 1
                    Y2 += 1
            End Select
            If Spielfeld.OnMap(X2, Y2) Then
                If Untergund.Contains(Objektverwalter.Spielfeld.Landschaften(X2, Y2, Objektverwalter.Spielfeld.MomentaneSchlacht).getID) Then
                    Return True
                End If
            End If
        Next
        Return False
    End Function
    Private Shared Function KannGebaeudeplaziertwerden(ByVal X As Integer, ByVal Y As Integer, ByVal ID As String) As Boolean
        Dim G As ObjektGebaeude = ObjektLadeklasse.NewGebaeude(ID)
        For X2 = 0 To G.Verweisgebaeude.GetLength(0) - 1
            If Spielfeld.OnMap(X + G.Verweisgebaeude(X2, 0), Y + G.Verweisgebaeude(X2, 1)) Then
                If Not Objektverwalter.Spielfeld.Landschaften(X + G.Verweisgebaeude(X2, 0), Y + G.Verweisgebaeude(X2, 1), Objektverwalter.Spielfeld.MomentaneSchlacht).Hidden Then
                    If ISBauuntergrund(Objektverwalter.Spielfeld.Landschaften(X + G.Verweisgebaeude(X2, 0), Y + G.Verweisgebaeude(X2, 1), Objektverwalter.Spielfeld.MomentaneSchlacht).getID) = False Then
                        Return False
                    ElseIf Not Objektverwalter.Spielfeld.Einheiten(X + G.Verweisgebaeude(X2, 0), Y + G.Verweisgebaeude(X2, 1), Objektverwalter.Spielfeld.MomentaneSchlacht) Is Nothing Then
                        Return False
                    End If
                Else
                    Return False
                End If
            Else
                Return False
            End If
        Next
        Return True
    End Function
    Private Shared Function KannGebaeudeLuftplaziertwerden(ByVal X As Integer, ByVal Y As Integer, ByVal ID As String) As Boolean
        Dim G As ObjektGebaeude = ObjektLadeklasse.NewGebaeude(ID)
        For X2 = 0 To G.Verweisgebaeude.GetLength(0) - 1
            If Spielfeld.OnMap(X + G.Verweisgebaeude(X2, 0), Y + G.Verweisgebaeude(X2, 1)) Then
                If Not Objektverwalter.Spielfeld.Landschaften(X + G.Verweisgebaeude(X2, 0), Y + G.Verweisgebaeude(X2, 1), ObjektSpielfeld.Luftschlacht).Hidden Then
                    If Objektverwalter.Spielfeld.Landschaften(X + G.Verweisgebaeude(X2, 0), Y + G.Verweisgebaeude(X2, 1), ObjektSpielfeld.Luftschlacht).getID <> "LUFT" Then
                        Return False
                    ElseIf Not Objektverwalter.Spielfeld.Einheiten(X + G.Verweisgebaeude(X2, 0), Y + G.Verweisgebaeude(X2, 1), ObjektSpielfeld.Luftschlacht) Is Nothing Then
                        Return False
                    End If
                Else
                    Return False
                End If
            Else
                Return False
            End If
        Next
        Return True
    End Function
    ''' <summary>
    ''' Gibt zurueck ob der Untergrund Ebene Schnee oder Wueste ist auf dem Gebaeude erstellt werden koennen.
    ''' </summary>
    ''' <param name="Landschaft"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Shared Function ISBauuntergrund(ByVal Landschaft As String) As Boolean
        If Landschaft = "EBENE" Or Landschaft = "WUESTE" Or Landschaft = "SCHNEE" Or Landschaft = "EBENE+SCHROTT" Or Landschaft = "WUESTE+SCHROTT" Or Landschaft = "SCHNEE+SCHROTT" Then
            Return True
        Else
            Return False
        End If
    End Function
    Public Shared Sub GebaeudeBauen(ByVal X As Integer, ByVal Y As Integer, ByVal GebaeudeID As String)
        Dim M As ObjektSpielMenue = Objektverwalter.Menue


        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            'Dieser Befehl wird spaeter verschickt
            If Not GebaeudeID = "MAUER" Then
                If Not GebaeudeID = "BRUECKE" Then

                    Dim Befehl As New KINetzwerkBefehl
                    Befehl.Befehl = ObjektKI.KIModiExtern.GebaeudeBauen
                    Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
                    Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
                    If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                        Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                        Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
                    Else
                        Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                        Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
                    End If
                    Befehl.OpferX = Befehl.WegX(0)
                    Befehl.OpferY = Befehl.WegY(0)
                    Befehl.AngreiferSchaden = ObjektLadeklasse.GetGebaeudeZahlID(GebaeudeID)
                    Befehl.Verteidigerschaden = -1
                    Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
                    Hauptmenue.NetzBefehlSenden(Befehl)
                End If
            End If

        End If

        'Der Spieler verliert sein Geld
        If GebaeudeID <> "BRUECKE" Then
            If GebaeudeID <> "MAUER" Then
                Objektverwalter.Spielfeld.AktuellerSpieler.AddFonds(-ObjektLadeklasse.GetGebaeudeKosten(GebaeudeID, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler))
            End If
        End If
        If GebaeudeID = "SILO" Then
            Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude = ObjektLadeklasse.NewGebaeude("RAKETENSILO+RAKETE", 0, X, Y)
            Warten()
        ElseIf GebaeudeID = "MAUER" Then
            M.Spielmodus = ObjektSpielMenue.Spielmodi.MauerBauen
            BauFelderMarkieren(X, Y)
        ElseIf GebaeudeID = "BRUECKE" Then
            M.Spielmodus = ObjektSpielMenue.Spielmodi.BrueckeBauen
            BauFelderMarkieren(X, Y)
        ElseIf GebaeudeID = "FLIEGENDESMINIGESCHUETZ+N" Or GebaeudeID = "FLIEGENDESMINIGESCHUETZ+S" Or GebaeudeID = "FLIEGENDESMINIGESCHUETZ+W" Or GebaeudeID = "FLIEGENDESMINIGESCHUETZ+O" _
        Or GebaeudeID = "FLIEGENDEFESTUNG" Then
            SpezialGebaeudeBauen(X, Y, GebaeudeID, ObjektSpielfeld.Luftschlacht)
            Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = Nothing
            Spielfeld.Laufen.UpdateSichtBereich()
            Spielfeld.LaufenLoeschen = True
            Spielfeld.AktuelleEinheit = Nothing
            Spielfeld.AktuelleEinheitPosition = Nothing
            Spielfeld.Wegsuchsystem = Nothing
            Spielfeld.AktuelleEinheitPfeil = Nothing
            Spielfeld.AktuelleEinheitHatGefeuert = False
            Spielfeld.Sichterstellen()
            Spielfeld.Regeln.CheckSieg()

            M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts
        Else
            'wir bauen das Spezialgebaeude und entfernen die Einheit.
            SpezialGebaeudeBauen(X, Y, GebaeudeID, ObjektSpielfeld.Bodenschlacht)
            Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = Nothing
            Spielfeld.Laufen.UpdateSichtBereich()
            Spielfeld.LaufenLoeschen = True
            Spielfeld.AktuelleEinheit = Nothing
            Spielfeld.AktuelleEinheitPosition = Nothing
            Spielfeld.Wegsuchsystem = Nothing
            Spielfeld.AktuelleEinheitPfeil = Nothing
            Spielfeld.AktuelleEinheitHatGefeuert = False
            Spielfeld.Sichterstellen()
            Spielfeld.Regeln.CheckSieg()
            M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts
        End If
        ObjektScript.Pruefen(ObjektScript.Pruefstadien.RundenMitte)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    Public Shared Sub SpezialGebaeudeBauen(ByVal X As Integer, ByVal Y As Integer, ByVal GebaeudeID As String, ByVal Schlacht As Integer)
        Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Gebaeude = ObjektLadeklasse.NewGebaeude(GebaeudeID, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, X, Y, Nothing)
    End Sub
    ''' <summary>
    ''' Wenn True dann kann die Einheit besetzen.
    ''' </summary>
    ''' <param name="EinheitenID"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function KannEinheitBesetzen(ByVal EinheitenID As String) As Boolean
        For Each Einheit In AlleEinheiten
            If Einheit.EinheitenID = EinheitenID Then
                If Einheit.Einheit.KannBesetzen = True Then
                    Return True
                Else
                    Return False
                End If
            End If
        Next
        Return False
    End Function
    ''' <summary>
    ''' Gibt zurueck ob die Einheit Waffen hat mit denen sie angreifen kann.
    ''' </summary>
    ''' <param name="EinheitenID"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function HatEinheitWaffen(ByVal EinheitenID As String) As Boolean
        For Each Einheit In AlleEinheiten
            If Einheit.EinheitenID = EinheitenID Then
                If Not Einheit.Einheit.Waffe1 = "Keine" Or Not Einheit.Einheit.Waffe2 = "Keine" Then
                    Return True
                Else
                    Return False
                End If
            End If
        Next
        Return False
    End Function
    ''' <summary>
    ''' Ueberprueft nur die Sende Map nicht ob das Feld frei ist.
    ''' </summary>
    ''' <param name="Einheit"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function KannSchicken(ByVal Einheit As ObjektEinheit) As Boolean
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht Then
            If Einheit.GetSendeMap >= 0 Then
                Return True
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function
    Public Shared Function KannSchicken() As Boolean
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht Then
            Dim SendeMap As Integer = Objektverwalter.Spielfeld.AktuelleEinheit.GetSendeMap
            If SendeMap >= 0 Then
                If Objektverwalter.Spielfeld.Laufen Is Nothing Then
                    If Objektverwalter.Spielfeld.Einheiten(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, SendeMap) Is Nothing Then
                        Return True
                    Else
                        Return False
                    End If
                Else
                    If Objektverwalter.Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, SendeMap) Is Nothing Then
                        Return True
                    Else
                        Return False
                    End If
                End If
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function
    ''' <summary>
    ''' Baut eine temporaere Basis, diese koennen Versorgen und Reparieren, aber nicht bauen!
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub BuildTempBase()

        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Build temporary Building.")
        End If

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Warten
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = Befehl.WegX(0)
            Befehl.OpferY = Befehl.WegY(0)
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If

        DoExtraActions()

        If IsNothing(Spielfeld.Laufen) Then
            MarkierteFelder.Clear()
            Spielfeld.AktuelleEinheit.HatsichBewegt = True
            Spielfeld.Einheiten(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y, Spielfeld.MomentaneSchlacht) = Spielfeld.AktuelleEinheit
            Hauptmenue.CursorPlazieren(Spielfeld.AktuelleEinheitPosition.X * Hauptmenue.Feldbreite, Spielfeld.AktuelleEinheitPosition.Y * Hauptmenue.Feldbreite)
            'Bauen
            If TypeOf Spielfeld.AktuelleEinheit Is EinheitTTP Then
                Dim TTP As EinheitTTP = Spielfeld.AktuelleEinheit
                TTP.BuildTempBase(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y)
            ElseIf TypeOf Spielfeld.AktuelleEinheit Is EinheitBaupanzer Then
                Dim BauPanzer As EinheitBaupanzer = Spielfeld.AktuelleEinheit
                BauPanzer.BuildTempBase(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y)
            ElseIf TypeOf Spielfeld.AktuelleEinheit Is EinheitCustom Then
                Dim BauPanzer As EinheitCustom = Spielfeld.AktuelleEinheit
                BauPanzer.BuildTempBase(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y)
            End If
        Else
            If Spielfeld.Regeln.Nebel = Nebelarten.Aus Then
                If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                    Spielfeld.AktuelleEinheit.Treibstoff = -Objektverwalter.Spielfeld.AktuelleEinheitPfeil.TreibstoffVerbrauch
                Else
                    Spielfeld.AktuelleEinheit.Treibstoff = -Spielfeld.Wegsuchsystem.getBewegungspunktekosten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y)
                End If
            End If
            If Spielfeld.AktuelleEinheit.Bewegungsart = MovementSorts.Hoellium.ToString Then
                If IsNothing(Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht)) = False Then
                    NeuObjektAnimation(New Point(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y), "Land", Objektverwalter.Spielfeld.MomentaneSchlacht)
                End If
            End If
            'Bauen
            If TypeOf Spielfeld.AktuelleEinheit Is EinheitTTP Then
                Dim TTP As EinheitTTP = Spielfeld.AktuelleEinheit
                TTP.StopBuildTempBase()
                TTP.BuildTempBase(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y)
            ElseIf TypeOf Spielfeld.AktuelleEinheit Is EinheitBaupanzer Then
                Dim BauPanzer As EinheitBaupanzer = Spielfeld.AktuelleEinheit
                BauPanzer.StopBuildTempBase()
                BauPanzer.BuildTempBase(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y)
            ElseIf TypeOf Spielfeld.AktuelleEinheit Is EinheitCustom Then
                Dim BauPanzer As EinheitCustom = Spielfeld.AktuelleEinheit
                BauPanzer.BuildTempBase(Spielfeld.AktuelleEinheitPosition.X, Spielfeld.AktuelleEinheitPosition.Y)
            End If


            Spielfeld.AktuelleEinheit.X = Spielfeld.Laufen.Position.X
            Spielfeld.AktuelleEinheit.Y = Spielfeld.Laufen.Position.Y
            Spielfeld.AktuelleEinheit.HatsichBewegt = True
            Spielfeld.Einheiten(Spielfeld.Laufen.Position.X, Spielfeld.Laufen.Position.Y, Spielfeld.MomentaneSchlacht) = Spielfeld.AktuelleEinheit
            Hauptmenue.CursorPlazieren(Spielfeld.Laufen.Position.X * Hauptmenue.Feldbreite, Spielfeld.Laufen.Position.Y * Hauptmenue.Feldbreite)
            Spielfeld.Laufen.UpdateSichtBereich()
            Spielfeld.LaufenLoeschen = True
        End If



        Spielfeld.AktuelleEinheit = Nothing
        Spielfeld.AktuelleEinheitPosition = Nothing
        Spielfeld.Wegsuchsystem = Nothing
        Spielfeld.AktuelleEinheitPfeil = Nothing
        Spielfeld.AktuelleEinheitHatGefeuert = False
        Spielfeld.Sichterstellen()
        Spielfeld.Regeln.CheckSieg()
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts
        ObjektScript.Pruefen(ObjektScript.Pruefstadien.RundenMitte)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
    End Sub
    ''' <summary>
    ''' Macht die aktuelle Einheit zur KO Einheit
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub CreateKOEinheit()
        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Selected Unit becomes a CO-Unit.")
        End If
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            Befehl.Befehl = ObjektKI.KIModiExtern.CreateKOEinheit
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = Befehl.WegX(0)
            Befehl.OpferY = Befehl.WegY(0)
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If

        Spielfeld.AktuellerSpieler.AddFonds(-Spielfeld.AktuelleEinheit.Kosten / 2)
        If Objektverwalter.Spielfeld.Laufen Is Nothing Then
            Spielfeld.Spieler(Spielfeld.AktuelleEinheit.Spieler).KOS(0).SetKOEinheit(Spielfeld.AktuelleEinheit)
            Einheitabwaehlen()
        Else
            Spielfeld.Spieler(Spielfeld.AktuelleEinheit.Spieler).KOS(0).SetKOEinheit(Spielfeld.AktuelleEinheit)
            Warten()
        End If
    End Sub
    Public Shared Sub MauerBrueckeBauen(ByVal X As Integer, ByVal Y As Integer)
        Dim M As ObjektSpielMenue = Menue

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            Befehl.Befehl = ObjektKI.KIModiExtern.GebaeudeBauen
            Befehl.KooX = Objektverwalter.Spielfeld.AktuelleEinheitPosition.X
            Befehl.KooY = Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Befehl.WegX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                Befehl.WegY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
            Else
                Befehl.WegX = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.X}
                Befehl.WegY = New Integer() {Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y}
            End If
            Befehl.OpferX = X
            Befehl.OpferY = Y
            Select Case M.Spielmodus
                Case ObjektSpielMenue.Spielmodi.MauerBauen
                    Befehl.AngreiferSchaden = ObjektLadeklasse.GetGebaeudeZahlID("MAUER")
                Case ObjektSpielMenue.Spielmodi.BrueckeBauen
                    Befehl.AngreiferSchaden = ObjektLadeklasse.GetGebaeudeZahlID("BRUECKE")
            End Select

            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If

        'So jetzt muessen wir es noch tun
        Select Case M.Spielmodus
            Case ObjektSpielMenue.Spielmodi.MauerBauen
                Spielfeld.AktuellerSpieler.AddFonds(-ObjektLadeklasse.GetGebaeudeKosten("MAUER", Spielfeld.AktuellerSpieler.Spieler))
                Dim ID As String = Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).getID
                Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = New ObjektLandschaft("MAUER", X, Y, Spielfeld)
                Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).WirdZu = ID
                AngrenzendeUebergaengeAktualisieren(X, Y, New String() {"MAUER"})
            Case ObjektSpielMenue.Spielmodi.BrueckeBauen
                Spielfeld.AktuellerSpieler.AddFonds(-ObjektLadeklasse.GetGebaeudeKosten("BRUECKE", Spielfeld.AktuellerSpieler.Spieler))
                Dim ID As String = Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).getID
                Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = New ObjektLandschaft("BAUBRUECKE", X, Y, Spielfeld)
                Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).WirdZu = ID
                AngrenzendeUebergaengeAktualisieren(X, Y, New String() {"BAUBRUECKE", "SEE", "STRAND", "FLUSS"})
        End Select
        Warten()
    End Sub
    Public Shared Sub BauFelderMarkieren(ByVal X As Integer, ByVal Y As Integer)
        Dim X2 As Integer = X
        Dim Y2 As Integer = Y
        Dim P As New Point(X, Y)
        Dim Untergund As String() = {}
        Dim M As ObjektSpielMenue = Menue
        Select Case M.Spielmodus
            Case ObjektSpielMenue.Spielmodi.BrueckeBauen
                Untergund = New String() {"FLUSS", "SEE"}
            Case ObjektSpielMenue.Spielmodi.MauerBauen
                Untergund = New String() {"EBENE", "EBENE+SCHROTT", "STRASSE", "SCHNEE", "SCHNEE+SCHROTT", "WUESTE", "WUESTE+SCHROTT", "PFAD", "STRASSENFROST"}
        End Select
        For I = 0 To 3
            Select Case I
                Case 0
                    X2 -= 1
                Case 1
                    X2 += 1
                    Y2 -= 1
                Case 2
                    X2 += 1
                    Y2 += 1
                Case 3
                    X2 -= 1
                    Y2 += 1
            End Select
            If Spielfeld.OnMap(X2, Y2) Then
                If Untergund.Contains(Objektverwalter.Spielfeld.Landschaften(X2, Y2, Objektverwalter.Spielfeld.MomentaneSchlacht).getID) Then
                    neuMarkiertesFeld(X2, Y2, Color.FromArgb(160, 255, 255, 255), "Blau")
                End If
            End If
        Next
        Hauptmenue.CursorPlazieren(Objektverwalter.MarkierteFelder(0).X * Hauptmenue.Feldbreite, Objektverwalter.MarkierteFelder(0).Y * Hauptmenue.Feldbreite)
    End Sub
    Public Shared Sub AngrenzendeUebergaengeAktualisieren(ByVal X As Integer, ByVal Y As Integer, ByVal Untergund() As String)
        Dim X2 As Integer = X
        Dim Y2 As Integer = Y
        Dim P As New Point(X, Y)

        For I = 0 To 3
            Select Case I
                Case 0
                    X2 -= 1
                Case 1
                    X2 += 1
                    Y2 -= 1
                Case 2
                    X2 += 1
                    Y2 += 1
                Case 3
                    X2 -= 1
                    Y2 += 1
            End Select
            If Spielfeld.OnMap(X2, Y2) Then
                If Untergund.Contains(Objektverwalter.Spielfeld.Landschaften(X2, Y2, Objektverwalter.Spielfeld.MomentaneSchlacht).getID) Then
                    Objektverwalter.Spielfeld.Landschaften(X2, Y2, Objektverwalter.Spielfeld.MomentaneSchlacht).UebergaengeAktualisieren(X2, Y2, Spielfeld)
                End If
            End If
        Next
    End Sub
    ''' <summary>
    ''' Zeigt die Rang Zone der Einheit an!
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <remarks></remarks>
    Public Shared Function ShowRangZone(ByVal X As Integer, ByVal Y As Integer) As Boolean
        Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, Spielfeld.MomentaneSchlacht)
        If E IsNot Nothing Then
            Dim L As ObjektLandschaft = Objektverwalter.Spielfeld.Landschaften(X, Y, 0)
            Dim Zone As Integer = E.GetUpgradeZone
            If Zone >= 0 Then
                Do Until L Is Nothing
                    neuMarkiertesFeld(L.KooX, L.KooY, Color.FromArgb(160, 255, 255, 255), "Gelb")
                    L = Wegsuchsystem.getFeldRundrum(X, Y, 0, 0, Zone, L, Spielfeld)
                Loop
            End If
            If MarkierteFelder.Count > 0 Then
                Return True
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function
#End Region
#Region "Gebaeude Befehle"
    Public Shared Sub Gebaeudeauswaehlen(ByVal X As Integer, ByVal Y As Integer)
        If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.GebaeudeID = "Verweis" Then
            X = Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Rechteck.X
            Y = Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Rechteck.Y
        End If
        Objektverwalter.Spielfeld.AktuelleEinheitPosition = New Point(X, Y)
        If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Spieler = Spielfeld.AktuellerSpieler.Spieler Then
            If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.GetBaulisteThisPlayer.Length > 0 Then
                If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Angriff = ObjektGebaeude.Angriffe.Keiner Then
                    CreateBauMenue(X, Y)
                End If
            ElseIf Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Angriff = ObjektGebaeude.Angriffe.FabrikBauen Then
                Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Feuer(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y)
            ElseIf Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Angriff = ObjektGebaeude.Angriffe.Rakete Then
                If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Feuerbereit = 0 Then
                    Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Feuer(X, Y)
                End If
            ElseIf Not Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Schaden = 0 Then
                If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Angriff = ObjektGebaeude.Angriffe.Strahl Then
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Feuerbereit = 0 Then
                        Spielfeld.AktuelleEinheitPosition = New Point(X, Y)
                        Dim Symbolen() As Texture = {Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Feuer.png")}
                        Dim Namen() As String = {"Laser"}
                        EinheitenMenue = New ObjektEinheitenmenue(Namen, Symbolen, Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Spieler, Hauptmenue.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, False, Nothing, False, True, ObjektEinheitenmenue.Modi.Anderes)
                    End If
                ElseIf Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Angriff = ObjektGebaeude.Angriffe.Kreis Then
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Feuerbereit = 0 Then
                        If TypeOf Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude Is GebaeudeAruura Then
                            Spielfeld.AktuelleEinheitPosition = New Point(X, Y)
                            Dim Symbolen() As Texture = {Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Feuer.png")}
                            Dim Namen() As String = {"aruurafeuer"}
                            EinheitenMenue = New ObjektEinheitenmenue(Namen, Symbolen, Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Spieler, Hauptmenue.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, False, Nothing, False, True, ObjektEinheitenmenue.Modi.Anderes)
                        Else
                            Spielfeld.AktuelleEinheitPosition = New Point(X, Y)
                            Dim Symbolen() As Texture = {Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Heilen.png")}
                            Dim Namen() As String = {"Heilen"}
                            EinheitenMenue = New ObjektEinheitenmenue(Namen, Symbolen, Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Spieler, Hauptmenue.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, False, Nothing, False, True, ObjektEinheitenmenue.Modi.Anderes)
                        End If

                    End If
                ElseIf Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Angriff = ObjektGebaeude.Angriffe.SchussN Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Angriff = ObjektGebaeude.Angriffe.SchussO Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Angriff = ObjektGebaeude.Angriffe.SchussS Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Angriff = ObjektGebaeude.Angriffe.SchussW Then
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Feuerbereit = 0 Then
                        Spielfeld.AktuelleEinheitPosition = New Point(X, Y)
                        Dim Symbolen() As Texture = {Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Feuer.png")}
                        Dim Namen() As String = {"Schuss"}
                        EinheitenMenue = New ObjektEinheitenmenue(Namen, Symbolen, Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Spieler, Hauptmenue.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, False, Nothing, False, True, ObjektEinheitenmenue.Modi.Anderes)
                    End If
                ElseIf Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Angriff = ObjektGebaeude.Angriffe.KugelKreis Then
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Feuerbereit = 0 Then
                        Spielfeld.AktuelleEinheitPosition = New Point(X, Y)
                        Dim Symbolen() As Texture = {Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Feuer.png")}
                        Dim Namen() As String = {"Kugel Feuern"}
                        EinheitenMenue = New ObjektEinheitenmenue(Namen, Symbolen, Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Spieler, Hauptmenue.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, False, Nothing, False, True, ObjektEinheitenmenue.Modi.Anderes)
                    End If
                ElseIf Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Angriff = ObjektGebaeude.Angriffe.DreiStrahlN Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Angriff = ObjektGebaeude.Angriffe.DreiStrahlO Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Angriff = ObjektGebaeude.Angriffe.DreiStrahlS Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Angriff = ObjektGebaeude.Angriffe.DreiStrahlW Then
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Feuerbereit = 0 Then
                        Spielfeld.AktuelleEinheitPosition = New Point(X, Y)
                        Dim Symbolen() As Texture = {Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Feuer.png")}
                        Dim Namen() As String = {"Schocklaser"}
                        EinheitenMenue = New ObjektEinheitenmenue(Namen, Symbolen, Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Spieler, Hauptmenue.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, False, Nothing, False, True, ObjektEinheitenmenue.Modi.Anderes)
                    End If
                Else

                End If
            Else
                AuswahlMenuerschaffen()
            End If
        ElseIf Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.GetBaulisteThisPlayer.Length > 0 Then
            'Mal sehen
            Select Case Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Baugebaeude
                Case ObjektKO.ReperaturGebaeude.OwnAndEnemyAndNeutral
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.GetSpieler.Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                        CreateBauMenue(X, Y)
                    Else
                        AuswahlMenuerschaffen()
                    End If
                Case ObjektKO.ReperaturGebaeude.OwnAndEnemy
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.GetSpieler.Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team And Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Spieler > 0 Then
                        CreateBauMenue(X, Y)
                    Else
                        AuswahlMenuerschaffen()
                    End If
                Case ObjektKO.ReperaturGebaeude.OwnAndNeutral
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Spieler = 0 Then
                        CreateBauMenue(X, Y)
                    Else
                        AuswahlMenuerschaffen()
                    End If
                Case ObjektKO.ReperaturGebaeude.Own
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                        CreateBauMenue(X, Y)
                    Else
                        AuswahlMenuerschaffen()
                    End If
                Case ObjektKO.ReperaturGebaeude.Allied
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.GetSpieler.Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                        CreateBauMenue(X, Y)
                    Else
                        AuswahlMenuerschaffen()
                    End If
                Case ObjektKO.ReperaturGebaeude.AlliedAndEnemy
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.GetSpieler.Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Spieler > 0 And Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.GetSpieler.Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                        CreateBauMenue(X, Y)
                    Else
                        AuswahlMenuerschaffen()
                    End If
                Case ObjektKO.ReperaturGebaeude.AlliedAndNeutral
                    If Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.GetSpieler.Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Or Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.Spieler = 0 Then
                        CreateBauMenue(X, Y)
                    Else
                        AuswahlMenuerschaffen()
                    End If
                Case ObjektKO.ReperaturGebaeude.AlliedAndEnemyAndNeutral
                    CreateBauMenue(X, Y)
            End Select
        Else
            AuswahlMenuerschaffen()
        End If
    End Sub
    Public Shared Sub CreateBauMenue(ByVal X As Integer, ByVal Y As Integer)
        If Objektverwalter.Spielfeld.AktuellerSpieler.VeraenderteWerte.KeinBau = False Then

            Dim Symbolen As New Stack(Of Texture)
            Dim SymbolMasken As New Stack(Of Texture)

            Dim Namen As New Stack(Of String)
            Dim Enabled As New Stack(Of Boolean)
            If Spielfeld.AktuelleEinheit Is Nothing Then
                Spielfeld.AktuelleEinheitPosition = New Point(X, Y)
                Dim B() As String = Spielfeld.Landschaften(X, Y, Spielfeld.MomentaneSchlacht).Gebaeude.GetBauliste(Spielfeld.AktuellerSpieler.Spieler)
                For I = 0 To B.Length - 1
                    Dim Name As String = ""
                    Name = ObjektLadeklasse.GetNamefromID(B(I)) + " "
                    Dim Kosten As Integer = ObjektLadeklasse.GetEinheitenkosten(B(I)) * Spielfeld.AktuellerSpieler.Teurungsrate(B(I), X, Y)
                    If IsNothing(Spielfeld.AktuellerSpieler.GetBauliste) Then
                        Name += Kosten.ToString
                        If Kosten > Spielfeld.AktuellerSpieler.Fonds Then
                            Enabled.Push(True)
                        Else
                            Enabled.Push(False)
                        End If
                        Dim ID As Integer = 0
                        For I2 = 0 To Objektverwalter.AlleEinheiten.Length - 1
                            If Objektverwalter.AlleEinheiten(I2).EinheitenID = B(I).ToUpper Then
                                ID = I2
                                Exit For
                            End If
                        Next
                        Dim Symbol As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentextur(Spielfeld.AktuellerSpieler.Armee)
                        Dim Maske As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentexturMaske(Spielfeld.AktuellerSpieler.Armee)
                        addMenueitem(Name, Symbol, Symbolen, Namen, , , Maske, SymbolMasken)
                    Else
                        If Spielfeld.AktuellerSpieler.GetBauliste.GetWert(B(I)) > 0 Then
                            'Es ist erlaubt diese Einheit zu bauen
                            Name += Kosten.ToString
                            If Kosten > Spielfeld.AktuellerSpieler.Fonds Then
                                Enabled.Push(True)
                            Else
                                Enabled.Push(False)
                            End If
                            Dim ID As Integer = 0
                            For I2 = 0 To Objektverwalter.AlleEinheiten.Length - 1
                                If Objektverwalter.AlleEinheiten(I2).EinheitenID = B(I).ToUpper Then
                                    ID = I2
                                    Exit For
                                End If
                            Next
                            Dim Symbol As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentextur(Spielfeld.AktuellerSpieler.Armee)
                            Dim Maske As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentexturMaske(Spielfeld.AktuellerSpieler.Armee)
                            addMenueitem(Name, Symbol, Symbolen, Namen, , , Maske, SymbolMasken)
                        End If
                    End If
                Next
                If Namen.Count > 0 Then
                    If (DataSettings.draw3D Or DataSettings._2D_3D_Malen) Then
                        EinheitenMenue = New ObjektEinheitenmenue(Namen.ToArray, Symbolen.ToArray, Spielfeld.AktuellerSpieler.Spieler, Hauptmenue.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, True, Enabled.ToArray, False, False, ObjektEinheitenmenue.Modi.Einheitbauen, SymbolMasken.ToArray)
                    Else
                        EinheitenMenue = New ObjektEinheitenmenue(Namen.ToArray, Symbolen.ToArray, Spielfeld.AktuellerSpieler.Spieler, Hauptmenue.Feldbreite, X * Hauptmenue.Feldbreite + Spielfeld.BildschirmKooX, Y * Hauptmenue.Feldbreite + Spielfeld.BildschirmKooY, True, Enabled.ToArray, False, False, ObjektEinheitenmenue.Modi.Einheitbauen, SymbolMasken.ToArray)
                    End If
                Else

                End If
            Else
                Dim Bauliste As String() = ObjektLadeklasse.GetBauliste("FLUGZEUGTRAEGER")
                For I = 0 To Bauliste.Length - 1
                    Dim Name As String = ""
                    Name = ObjektLadeklasse.GetNamefromID(Bauliste(I)) + " "
                    Dim Kosten As Integer = ObjektLadeklasse.GetEinheitenkosten(Bauliste(I)) * Spielfeld.AktuellerSpieler.Teurungsrate(Bauliste(I), X, Y)
                    If IsNothing(Spielfeld.AktuellerSpieler.GetBauliste) Then
                        Name += Kosten.ToString
                        If Kosten > Spielfeld.AktuellerSpieler.Fonds Then
                            Enabled.Push(True)
                        Else
                            Enabled.Push(False)
                        End If
                        Dim ID As Integer = 0
                        For I2 = 0 To Objektverwalter.AlleEinheiten.Length - 1
                            If Objektverwalter.AlleEinheiten(I2).EinheitenID = Bauliste(I).ToUpper Then
                                ID = I2
                                Exit For
                            End If
                        Next
                        Dim Symbol As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentextur(Spielfeld.AktuellerSpieler.Armee)
                        Dim Maske As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentexturMaske(Spielfeld.AktuellerSpieler.Armee)
                        addMenueitem(Name, Symbol, Symbolen, Namen, , , Maske, SymbolMasken)
                    Else
                        If Spielfeld.AktuellerSpieler.GetBauliste.GetWert(Bauliste(I)) > 0 Then
                            'Es ist erlaubt diese Einheit zu bauen
                            Name += Kosten.ToString
                            If Kosten > Spielfeld.AktuellerSpieler.Fonds Then
                                Enabled.Push(True)
                            Else
                                Enabled.Push(False)
                            End If
                            Dim ID As Integer = 0
                            For I2 = 0 To Objektverwalter.AlleEinheiten.Length - 1
                                If Objektverwalter.AlleEinheiten(I2).EinheitenID = Bauliste(I).ToUpper Then
                                    ID = I2
                                    Exit For
                                End If
                            Next
                            Dim Symbol As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentextur(Spielfeld.AktuellerSpieler.Armee)
                            Dim Maske As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentexturMaske(Spielfeld.AktuellerSpieler.Armee)
                            addMenueitem(Name, Symbol, Symbolen, Namen, , , Maske, SymbolMasken)
                        End If
                    End If
                Next
                If Namen.Count > 0 Then
                    If (DataSettings.draw3D Or DataSettings._2D_3D_Malen) Then
                        EinheitenMenue = New ObjektEinheitenmenue(Namen.ToArray, Symbolen.ToArray, Spielfeld.AktuellerSpieler.Spieler, Hauptmenue.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, True, Enabled.ToArray, False, False, ObjektEinheitenmenue.Modi.Einheitbauen, SymbolMasken.ToArray)
                    Else
                        EinheitenMenue = New ObjektEinheitenmenue(Namen.ToArray, Symbolen.ToArray, Spielfeld.AktuellerSpieler.Spieler, Hauptmenue.Feldbreite, X * Hauptmenue.Feldbreite + Spielfeld.BildschirmKooX, Y * Hauptmenue.Feldbreite + Spielfeld.BildschirmKooY, True, Enabled.ToArray, False, False, ObjektEinheitenmenue.Modi.Einheitbauen, SymbolMasken.ToArray)
                    End If
                Else

                End If
            End If
        End If
    End Sub
#End Region
#Region "Plazieren und Loeschen von Dingen im Editor"
    ''' <summary>
    ''' Generiert die Uebergaenge aller Landschaften neu
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub UebergaengeAktualiesieren()
        Dim UebergaengenochmalAktualiesieren As Boolean = False
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                If Not Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).BildIDFest Then

                    Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).UebergaengeAktualisieren(X, Y, Objektverwalter.Spielfeld)

                    If Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).BildID < 0 Then
                        Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = New ObjektLandschaft("EBENE", X, Y, Objektverwalter.Spielfeld)
                        UebergaengenochmalAktualiesieren = True
                    Else
                        Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).UebergaengeAktualisieren(X, Y, Objektverwalter.Spielfeld)
                    End If
                End If
            Next
        Next
        If UebergaengenochmalAktualiesieren = True Then
            UebergaengeAktualiesieren()
        End If
    End Sub
    Public Shared Function KannEinheitplaziertwerden(ByVal X As Integer, ByVal Y As Integer, ByVal EinheitenID As String, ByVal Wetter As ObjektSpielfeld.Wetterarten) As Boolean
        Dim M As ObjektKarteneditormenue = Objektverwalter.Menue
        If M.Karteneditor.AktuelleEinheit = -1 Then Return False
        If Objektverwalter.Bewegungskosten(Objektverwalter.AlleEinheiten(M.Karteneditor.AktuelleEinheit).Einheit.Bewegungsart, Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).getID, ObjektSpielfeld.Wetterarten.Sonne) > 0 Then
            Return True
        End If
        Return False
    End Function
    Public Shared Function KannLandschaftplaziertwerden(ByVal X As Integer, ByVal Y As Integer, ByVal ID As Integer) As Boolean
        If Objektverwalter.LandschaftenBilder(ID).BildID(X, Y, Objektverwalter.Spielfeld) >= 0 Then
            Return True
        End If
        Return False
    End Function
    Public Shared Sub Einheitplazieren()
        Dim Kreis(,) As Integer = {}
        Dim Radius As Integer = 0
        Dim Karteneditor As ObjektKarteneditormenue = Objektverwalter.Menue
        Select Case Karteneditor.Karteneditor.Plaziergroesse
            Case ObjektKarteneditor.PlazierGroessen.Klein
                Einheitplazieren(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y)
            Case ObjektKarteneditor.PlazierGroessen.Mittel
                Kreis = Kreisfunktion(1)
                Radius = 1
            Case ObjektKarteneditor.PlazierGroessen.Gross
                Kreis = Kreisfunktion(2)
                Radius = 2
            Case ObjektKarteneditor.PlazierGroessen.Fuellen
                Einheitplazieren(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y)
        End Select
        For X = 0 To Kreis.GetLength(0) - 1
            For Y = 0 To Kreis.GetLength(1) - 1
                If Kreis(X, Y) >= 0 Then
                    Einheitplazieren(Hauptmenue.SpielfeldPunkt.X - Radius + X, Hauptmenue.SpielfeldPunkt.Y - Radius + Y)
                End If
            Next
        Next
    End Sub
    Public Shared Sub Landschaftplazieren()
        Dim Kreis(,) As Integer = {}
        Dim Radius As Integer = 0
        Dim Karteneditor As ObjektKarteneditormenue = Objektverwalter.Menue
        Select Case Karteneditor.Karteneditor.Plaziergroesse
            Case ObjektKarteneditor.PlazierGroessen.Klein
                Landschaftplazieren(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y, True)
            Case ObjektKarteneditor.PlazierGroessen.Mittel
                Kreis = Kreisfunktion(1)
                Radius = 1
            Case ObjektKarteneditor.PlazierGroessen.Gross
                Kreis = Kreisfunktion(2)
                Radius = 2
            Case ObjektKarteneditor.PlazierGroessen.Fuellen
                If Objektverwalter.Spielfeld.OnMap(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y) Then
                    Dim LS As New Landschaftssuchsystem(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y, Objektverwalter.Spielfeld.Landschaften(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).getID, Objektverwalter.Spielfeld.MomentaneSchlacht)
                    For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                        For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                            If LS.GetDauer(X, Y) >= 0 Then
                                Landschaftplazieren(X, Y, False)
                            End If
                        Next
                    Next
                End If
        End Select
        For X = 0 To Kreis.GetLength(0) - 1
            For Y = 0 To Kreis.GetLength(1) - 1
                If Kreis(X, Y) >= 0 Then
                    Landschaftplazieren(Hauptmenue.SpielfeldPunkt.X - Radius + X, Hauptmenue.SpielfeldPunkt.Y - Radius + Y, False)
                End If
            Next
        Next
        If Karteneditor.Karteneditor.Plaziergroesse > ObjektKarteneditor.PlazierGroessen.Klein Then
            UebergaengeAktualiesieren()
        End If
    End Sub
    Public Shared Sub Gebaeudeplazieren()
        Dim Kreis(,) As Integer = {}
        Dim Radius As Integer = 0
        Dim Karteneditor As ObjektKarteneditormenue = Objektverwalter.Menue
        Dim Gebaeudeinstanz As ObjektGebaeude = ObjektLadeklasse.NewGebaeude(AlleGebaeude(Karteneditor.Karteneditor.AktuelleGebaeude).GebaeudeID, Karteneditor.Karteneditor.MomenentanerSpieler, -10, -10, Nothing)
        Select Case Karteneditor.Karteneditor.Plaziergroesse
            Case ObjektKarteneditor.PlazierGroessen.Klein
                Gebaeudeplazieren(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y, Gebaeudeinstanz)
            Case ObjektKarteneditor.PlazierGroessen.Mittel
                Kreis = Kreisfunktion(1)
                Radius = 1
            Case ObjektKarteneditor.PlazierGroessen.Gross
                Kreis = Kreisfunktion(2)
                Radius = 2
            Case ObjektKarteneditor.PlazierGroessen.Fuellen
                If Objektverwalter.Spielfeld.OnMap(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y) Then
                    Dim LS As New Landschaftssuchsystem(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y, Objektverwalter.Spielfeld.Landschaften(Hauptmenue.SpielfeldPunkt.X, Hauptmenue.SpielfeldPunkt.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).getID, Objektverwalter.Spielfeld.MomentaneSchlacht)
                    For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                        For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                            If LS.GetDauer(X, Y) >= 0 Then
                                Gebaeudeplazieren(X, Y, Gebaeudeinstanz)
                            End If
                        Next
                    Next
                End If
        End Select
        For X = 0 To Kreis.GetLength(0) - 1
            For Y = 0 To Kreis.GetLength(1) - 1
                If Kreis(X, Y) >= 0 Then
                    Gebaeudeplazieren(Hauptmenue.SpielfeldPunkt.X - Radius + X, Hauptmenue.SpielfeldPunkt.Y - Radius + Y, Gebaeudeinstanz)
                End If
            Next
        Next
    End Sub
    ''' <summary>
    ''' Plaziert die ausgewaehlte Einheit
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub Einheitplazieren(ByVal X As Integer, ByVal Y As Integer)
        Dim Karteneditor As ObjektKarteneditormenue = Objektverwalter.Menue
        If Not ObjektMaus.Zustand = ObjektMaus.Zustaende.NichtPlazierbar Then
            If Not Karteneditor.Karteneditor.MomenentanerSpieler = 0 Then
                If Spielfeld.OnMap(X, Y) Then
                    If KannEinheitplaziertwerden(X, Y, Objektverwalter.AlleEinheiten(Karteneditor.Karteneditor.AktuelleEinheit).EinheitenID, ObjektSpielfeld.Wetterarten.Sonne) Then
                        Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = ObjektLadeklasse.NewEinheit(Objektverwalter.AlleEinheiten(Karteneditor.Karteneditor.AktuelleEinheit).EinheitenID, Karteneditor.Karteneditor.MomenentanerSpieler, X, Y, False)
                        'Custom Einheiten muessen speziell geladen werden.
                        If TypeOf Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) Is EinheitCustom Then
                            Dim C As EinheitCustom = Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht)
                            C.Datenladen(Karteneditor.Karteneditor.AktuelleEinheit)
                        End If
                    End If
                End If
            End If
        End If
    End Sub
    ''' <summary>
    ''' Plaziert die ausgewaehlte Landschaft
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub Landschaftplazieren(ByVal X As Integer, ByVal Y As Integer, ByVal Uebergaengeaktualisieren As Boolean)
        Dim Karteneditor As ObjektKarteneditormenue = Objektverwalter.Menue
        If Not ObjektMaus.Zustand = ObjektMaus.Zustaende.NichtPlazierbar Then
            If Spielfeld.OnMap(X, Y) Then
                If KannLandschaftplaziertwerden(X, Y, Karteneditor.Karteneditor.AktuelleLandschaft) = True Then
                    If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude) = False Then
                        GebaeudeLoeschen(X, Y)
                    End If
                    Dim Terrain As ObjektLandschaft = Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht)
                    Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = New ObjektLandschaft(Objektverwalter.LandschaftenBilder(Karteneditor.Karteneditor.AktuelleLandschaft).ID, X, Y, Objektverwalter.Spielfeld)
                    Dim Textur As ObjektLandschaftsTextur = Objektverwalter.LandschaftenBilder(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).ID)
                    Dim TexturUntergrund As String() = Textur.GetTerrainUntergrund
                    If Terrain.LandschaftsID = Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).LandschaftsID And Terrain.TerrainUntergrundID >= 0 Then
                        Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).TerrainUntergrundID = Terrain.TerrainUntergrundID
                        Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).TerrainUntergrundBildID = Terrain.TerrainUntergrundBildID
                    ElseIf TexturUntergrund.Contains(Terrain.LandschaftsID) Then
                        Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).TerrainUntergrundID = Terrain.ID
                        Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).TerrainUntergrundBildID = Terrain.BildID
                    ElseIf TexturUntergrund.Length > 0 Then
                        Dim ID As Integer = 0
                        For I = 0 To Objektverwalter.LandschaftenBilder.Length - 1
                            If Objektverwalter.LandschaftenBilder(I).ID.ToUpper = TexturUntergrund(0).ToUpper Then
                                ID = I
                                Exit For
                            End If
                        Next
                        Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).TerrainUntergrundID = ID
                        Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).TerrainUntergrundBildID = Objektverwalter.LandschaftenBilder(ID).BildID(X, Y, Spielfeld, True)
                    End If
                    If Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).TerrainUntergrundID >= 0 Then
                        Textur = Objektverwalter.LandschaftenBilder(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).TerrainUntergrundID)
                        TexturUntergrund = Textur.GetTerrainUntergrund
                        If TexturUntergrund.Length > 0 Then
                            If Terrain.TerrainUntergrundID = Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).TerrainUntergrundID2 And Terrain.TerrainUntergrundID2 >= 0 Then
                                Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).TerrainUntergrundID2 = Terrain.TerrainUntergrundID
                                Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).TerrainUntergrundBildID2 = 0
                            ElseIf Terrain.TerrainUntergrundID >= 0 Then
                                If TexturUntergrund.Contains(Objektverwalter.LandschaftenBilder(Terrain.TerrainUntergrundID).ID) Then
                                    Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).TerrainUntergrundID2 = Terrain.TerrainUntergrundID
                                    Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).TerrainUntergrundBildID2 = 0
                                End If
                            ElseIf TexturUntergrund.Length > 0 Then
                                Dim ID As Integer = 0
                                For I = 0 To Objektverwalter.LandschaftenBilder.Length - 1
                                    If Objektverwalter.LandschaftenBilder(I).ID.ToUpper = TexturUntergrund(0).ToUpper Then
                                        ID = I
                                        Exit For
                                    End If
                                Next
                                Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).TerrainUntergrundID2 = ID
                                Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).TerrainUntergrundBildID2 = 0
                            End If
                        End If
                    End If
                    Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).UebergaengeAktualisieren(X, Y, Spielfeld)
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                        If KannEinheitplaziertwerden(X, Y, Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).EinheitenID, ObjektSpielfeld.Wetterarten.Sonne) = False Then
                            Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = Nothing
                        End If
                    End If
                End If
            End If
        End If
        If Uebergaengeaktualisieren Then
            UebergaengeAktualiesieren()
        End If
    End Sub
    ''' <summary>
    ''' Plaziert ein Gebaeude
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub Gebaeudeplazieren(ByVal X As Integer, ByVal Y As Integer, ByVal Gebaeudeinstanz As ObjektGebaeude)
        Dim Karteneditor As ObjektKarteneditormenue = Objektverwalter.Menue
        If Not ObjektMaus.Zustand = ObjektMaus.Zustaende.NichtPlazierbar Then
            If Spielfeld.OnMap(X, Y) Then
                If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude) = False Then
                    GebaeudeLoeschen(X, Y)
                End If
                If FindElement(Gebaeudeinstanz.GetLandschaftsuntergrund, Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).LandschaftsID, True) < 0 Then
                    Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = New ObjektLandschaft(Gebaeudeinstanz.GetLandschaftsuntergrund(0), X, Y, Objektverwalter.Spielfeld)
                End If
                Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude = ObjektLadeklasse.NewGebaeude(Gebaeudeinstanz.GebaeudeID, Karteneditor.Karteneditor.MomenentanerSpieler, X, Y, Nothing)
                If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                    If Not Objektverwalter.Bewegungskosten(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Bewegungsart, Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).getID, ObjektSpielfeld.Wetterarten.Sonne) > 0 Then
                        Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = Nothing
                    End If
                End If
            End If
        End If
    End Sub
    Public Shared Sub SpezialGebaeudePlazieren(ByVal X As Integer, ByVal Y As Integer)
        Dim M As ObjektKarteneditormenue = Objektverwalter.Menue
        If Not ObjektMaus.Zustand = ObjektMaus.Zustaende.NichtPlazierbar Then
            If Spielfeld.OnMap(X, Y) Then
                Dim Gebaeudeinstanz As ObjektGebaeude = ObjektLadeklasse.NewGebaeude(Objektverwalter.AlleGebaeude(M.Karteneditor.AktuellesSpezialGebaeude).GebaeudeID)
                Dim X1() As Integer = {X}
                Dim Y1() As Integer = {Y}
                Dim D(,) As Integer = New Integer(,) {}
                If IsNothing(Gebaeudeinstanz) = False Then
                    D = Gebaeudeinstanz.Verweisgebaeude
                End If
                For I = 0 To D.GetLength(0) - 1
                    Dim X2 As Integer = D(I, 0) + X
                    Dim Y2 As Integer = D(I, 1) + Y
                    If Spielfeld.OnMap(X2, Y2) Then
                        Array.Resize(X1, X1.Length + 1)
                        Array.Resize(Y1, Y1.Length + 1)
                        X1(X1.Length - 1) = X2
                        Y1(Y1.Length - 1) = Y2
                    Else
                        Exit Sub
                    End If
                Next
                For I = 0 To X1.Length - 1
                    If IsNothing(Objektverwalter.Spielfeld.Landschaften(X1(I), Y1(I), Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude) = False Then
                        GebaeudeLoeschen(X1(I), Y1(I))
                    End If
                Next
                For I = 0 To X1.Length - 1
                    If FindElement(Gebaeudeinstanz.GetLandschaftsuntergrund, Objektverwalter.Spielfeld.Landschaften(X1(I), Y1(I), Objektverwalter.Spielfeld.MomentaneSchlacht).LandschaftsID, True) < 0 Then
                        Objektverwalter.Spielfeld.Landschaften(X1(I), Y1(I), Objektverwalter.Spielfeld.MomentaneSchlacht) = New ObjektLandschaft(Gebaeudeinstanz.GetLandschaftsuntergrund(0), X1(I), Y1(I), Objektverwalter.Spielfeld)
                    End If
                    If I = 0 Then
                        Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude = ObjektLadeklasse.NewGebaeude(Objektverwalter.AlleGebaeude(M.Karteneditor.AktuellesSpezialGebaeude).GebaeudeID, M.Karteneditor.MomenentanerSpieler, X, Y)
                    End If
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X1(I), Y1(I), Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                        If Not Objektverwalter.Bewegungskosten(Objektverwalter.Spielfeld.Einheiten(X1(I), Y1(I), Objektverwalter.Spielfeld.MomentaneSchlacht).Bewegungsart, Objektverwalter.Spielfeld.Landschaften(X1(I), Y1(I), Objektverwalter.Spielfeld.MomentaneSchlacht).getID, ObjektSpielfeld.Wetterarten.Sonne) > 0 Then
                            Objektverwalter.Spielfeld.Einheiten(X1(I), Y1(I), Objektverwalter.Spielfeld.MomentaneSchlacht) = Nothing
                        End If
                    End If
                Next
                UebergaengeAktualiesieren()
            End If
        End If
    End Sub
    Public Shared Sub GebaeudeLoeschen(ByVal X As Integer, ByVal Y As Integer)
        If Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude IsNot Nothing Then
            X = Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Rechteck.X, Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Rechteck.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Rechteck.X
            Y = Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Rechteck.X, Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Rechteck.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Rechteck.Y
            Dim D(,) As Integer = Objektverwalter.Spielfeld.Landschaften(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Rechteck.X, Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Rechteck.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Verweisgebaeude
            For I = 0 To D.GetLength(0) - 1
                Objektverwalter.Spielfeld.Landschaften(X + D(I, 0), Y + D(I, 1), Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude = Nothing
            Next
            Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude = Nothing
        End If
    End Sub
    Public Shared Function KannSpezialGebaeudeplaziertwerden(ByVal X As Integer, ByVal Y As Integer) As Boolean
        Dim M As ObjektKarteneditormenue = Objektverwalter.Menue
        Dim Gebaeudeinstanz As ObjektGebaeude = ObjektLadeklasse.NewGebaeude(Objektverwalter.AlleGebaeude(M.Karteneditor.AktuellesSpezialGebaeude).GebaeudeID)
        Dim D(,) As Integer = Gebaeudeinstanz.Verweisgebaeude
        For I = 0 To D.GetLength(0) - 1
            Dim X2 As Integer = D(I, 0) + X
            Dim Y2 As Integer = D(I, 1) + Y
            If Spielfeld.OnMap(X2, Y2) Then

            Else
                Return False
            End If
        Next
        Return True
    End Function
    Public Shared Sub EinheitAbziehen(ByVal X As Integer, ByVal Y As Integer, Optional ByVal GleicherSpieler As Boolean = False)
        If Spielfeld.OnMap(X, Y) Then
            If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                If GleicherSpieler = False Then
                    Objektverwalter.NeuObjektAnimation(X, Y)
                    '  Objektverwalter.Spielfeld.Einheiten(SpielfeldPunkt.X, SpielfeldPunkt.Y) = Nothing
                ElseIf Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                    Objektverwalter.NeuObjektAnimation(X, Y)
                End If
            End If
        End If
    End Sub

#End Region
#Region "Zufallskarte"
    ''' <summary>
    ''' Erstellt eine Zufallskarte
    ''' </summary>
    ''' <param name="Breite"></param>
    ''' <param name="Hoehe"></param>
    ''' <param name="Spieler"></param>
    ''' <param name="Regeln"></param>
    ''' <remarks></remarks>
    Public Shared Function ZufallskarteSee(ByVal Breite As Integer, ByVal Hoehe As Integer, ByVal Spieler() As ObjektSpieler, ByVal Regeln As ObjektRegeln, Optional ByVal Strassenkreis As Boolean = True, Optional ByVal StartVektor As Integer = -1) As Integer
        Objektverwalter.Spielfeld = New ObjektSpielfeld(Breite, Hoehe, Spieler, Regeln)
        Dim R As Random
        If StartVektor < 0 Then
            StartVektor = Zufallszahl(0, Integer.MaxValue - 1)
            R = New Random(StartVektor)
        Else
            R = New Random(StartVektor)
        End If
        'wir erschaffen Areas von Landschaften
        Dim Max As Integer = Breite * Hoehe * 2.5#
        For I = 0 To Max
            '0=Ebene 1=Wald 2=Berg 6=See  
            Dim Zahl As Integer = R.Next(100)
            Dim Terrain As String = ""
            If Zahl < 30 Then
                Terrain = "EBENE"
            ElseIf Zahl < 60 Then
                Terrain = "WALD"
            ElseIf Zahl < 80 Then
                Terrain = "BERG"
            ElseIf Zahl < 100 Then
                Terrain = "SEE"
            Else
                Zahl = R.Next(2)
            End If
            Dim lim As Integer = 100
            If Zahl = 10 Then
                'Stadt
                'lim = r.nextInt(2)+1;
                lim = 1
            ElseIf Zahl = 0 Then
                'Ebene
                lim = R.Next(40) + 1
            ElseIf Zahl = 1 Then
                'Wald
                lim = R.Next(3) + 1
            ElseIf Zahl = 2 Then
                'Berg
                lim = R.Next(6) + 1
            ElseIf Zahl = 6 Then
                'See
                lim = R.Next(50) + 1
            Else
                lim = R.Next(10) + 1
            End If
            If Zahl = 6 Then
                BereichFuellen(Terrain, lim, True, R)
            Else
                BereichFuellen(Terrain, lim, True, R)
            End If
        Next
        'Jetzt werden ein paar Riffe plaziert
        Dim FelderZahl As Integer = Breite * Hoehe
        'maximal ein prozent der Felder sollte Ein Riff sein.
        Dim Felderprozent As Integer = FelderZahl * 0.05#
        'Jetzt kommen ein paar Waelder hinzu
        Felderprozent = FelderZahl * 0.05#
        For I = 1 To Felderprozent
            PlaceAreaTerrain("WALD", R.Next(2) + 1, True, R, "EBENE")
        Next
        'Jetzt kommen ein paar Berge hinzu
        Felderprozent = FelderZahl * 0.05#
        For I = 1 To Felderprozent
            PlaceAreaTerrain("BERG", R.Next(2) + 1, True, R, "EBENE")
        Next


        'Wir berechnen wie viele Gebaeude auf die Karte passen sollen.
        Felderprozent = FelderZahl * 0.1#
        'Jeder Spieler braucht 2 Gebaeude eine Basis und ein HQ
        Dim MinGebaeude As Integer = ((Spieler.Length - 1) * 2)
        If Felderprozent < MinGebaeude Then
            Felderprozent = MinGebaeude
        End If
        'Wir plazieren die Gebaeude
        CreateGebaeude(Felderprozent, Strassenkreis, R)
        'Wir plazieren die Straende
        PlaceStraende(R)
        'zu letzt werden die Riffe plaziert
        Felderprozent = FelderZahl * 0.05#
        'Riffe
        PlaceRiff(Felderprozent, R)
        'Jetzt muessen wir noch die Uebergaenge aktualiesieren.
        UebergaengeAktualiesieren()
        Zentrieren()
        Return StartVektor
    End Function
    ''' <summary>
    ''' Erstellt eine Zufallskarte
    ''' </summary>
    ''' <param name="Breite"></param>
    ''' <param name="Hoehe"></param>
    ''' <param name="Spieler"></param>
    ''' <param name="Regeln"></param>
    ''' <remarks></remarks>
    Public Shared Function Zufallskarte(ByVal Breite As Integer, ByVal Hoehe As Integer, ByVal Spieler() As ObjektSpieler, ByVal Regeln As ObjektRegeln, Optional ByVal Strassenkreis As Boolean = True, Optional ByVal StartVektor As Integer = -1) As Integer
        Objektverwalter.Spielfeld = New ObjektSpielfeld(Breite, Hoehe, Spieler, Regeln)
        Dim R As Random
        If StartVektor < 0 Then
            StartVektor = Zufallszahl(0, Integer.MaxValue - 1)
            R = New Random(StartVektor)
        Else
            R = New Random(StartVektor)
        End If
        'wir erschaffen Areas von Landschaften
        Dim Max As Integer = Breite * Hoehe * 2.5#
        For I = 0 To Max
            '0=Ebene 1=Wald 2=Berg 6=See  
            Dim Terrain As String = ""
            Dim Zahl As Integer = R.Next(100)
            If Zahl < 30 Then
                Terrain = "EBENE"
            ElseIf Zahl < 60 Then
                Terrain = "WALD"
            ElseIf Zahl < 80 Then
                Terrain = "BERG"
            ElseIf Zahl < 100 Then
                Terrain = "SEE"
            Else
                Zahl = R.Next(2)
            End If
            Dim lim As Integer = 100
            If Zahl = 10 Then
                'Stadt
                'lim = r.nextInt(2)+1;
                lim = 1
            ElseIf Zahl = 0 Then
                'Ebene
                lim = R.Next(40) + 1
            ElseIf Zahl = 1 Then
                'Wald
                lim = R.Next(3) + 1
            ElseIf Zahl = 2 Then
                'Berg
                lim = R.Next(6) + 1
            ElseIf Zahl = 6 Then
                'See
                lim = R.Next(50) + 1
            Else
                lim = R.Next(10) + 1
            End If
            If Zahl = 6 Then
                BereichFuellen(Terrain, lim, True, R)
            Else
                BereichFuellen(Terrain, lim, True, R)
            End If
        Next
        'Jetzt werden ein paar Riffe plaziert
        Dim FelderZahl As Integer = Breite * Hoehe
        'maximal ein prozent der Felder sollte Ein Riff sein.
        Dim Felderprozent As Integer = FelderZahl * 0.05#
        'Jetzt kommen ein paar Waelder hinzu
        Felderprozent = FelderZahl * 0.05#
        For I = 1 To Felderprozent
            PlaceAreaTerrain("EBENE", R.Next(2) + 1, True, R, "EBENE")
        Next
        'Jetzt kommen ein paar Berge hinzu
        Felderprozent = FelderZahl * 0.05#
        For I = 1 To Felderprozent
            PlaceAreaTerrain("BERG", R.Next(2) + 1, True, R, "EBENE")
        Next
        'Wir berechnen wie viele Gebaeude auf die Karte passen sollen.
        Felderprozent = FelderZahl * 0.1#
        'Jeder Spieler braucht 2 Gebaeude eine Basis und ein HQ
        Dim MinGebaeude As Integer = ((Spieler.Length - 1) * 2)
        If Felderprozent < MinGebaeude Then
            Felderprozent = MinGebaeude
        End If
        'Wir plazieren die Gebaeude
        CreateGebaeude(Felderprozent, Strassenkreis, R, True)
        'Jetzt muessen wir noch die Uebergaenge aktualiesieren.
        UebergaengeAktualiesieren()
        Zentrieren()
    End Function
    ''' <summary>
    ''' Plaziert einige Landschaften
    ''' </summary>
    ''' <param name="LIM"></param>
    ''' <param name="cont"></param>
    ''' <remarks></remarks>
    Private Shared Sub BereichFuellen(ByVal Terrain As String, ByVal LIM As Integer, ByVal cont As Boolean, ByVal R As Random, Optional ByVal NurBeiUntergrund As String = "")
        'Plaziert eimal die Landschaft
        Dim FuellGrad As Integer = 0
        Dim r1 As Integer = R.Next(Objektverwalter.Spielfeld.Breite - 1)
        Dim r2 As Integer = R.Next(Objektverwalter.Spielfeld.Hoehe - 1)
        FeldPlazieren(r1, r2, Terrain)
        FuellGrad += 1
        'Fuellt die Landschaft aus.
        Dim Spielbereich(Objektverwalter.Spielfeld.Breite - 1, Objektverwalter.Spielfeld.Hoehe - 1) As Boolean
        For X1 = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y1 = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                If Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                    Spielbereich(X1, Y1) = True
                End If
            Next
        Next
        Dim Landschaft As ObjektLandschaft = Objektverwalter.Spielfeld.Landschaften(r1, r2, ObjektSpielfeld.Bodenschlacht)
        Dim X As Integer = r1
        Dim Y As Integer = r2
        While Not Landschaft Is Nothing
            If Objektverwalter.Spielfeld.OnMap(X + 1, Y) Then
                If R.Next(2) = 1 Then
                    If NurBeiUntergrund = "" Then
                        FeldPlazieren(X + 1, Y, Terrain)
                    Else
                        FeldPlazieren(X + 1, Y, Terrain, NurBeiUntergrund)
                    End If
                    FuellGrad += 1
                    If FuellGrad > LIM Then
                        Exit While
                    End If
                End If
            End If
            If Objektverwalter.Spielfeld.OnMap(X - 1, Y) Then
                If R.Next(2) = 1 Then
                    If NurBeiUntergrund = "" Then
                        FeldPlazieren(X - 1, Y, Terrain)
                    Else
                        FeldPlazieren(X - 1, Y, Terrain, NurBeiUntergrund)
                    End If
                    FuellGrad += 1
                    If FuellGrad > LIM Then
                        Exit While
                    End If
                End If
            End If
            If Objektverwalter.Spielfeld.OnMap(X, Y + 1) Then
                If R.Next(2) = 1 Then
                    If NurBeiUntergrund = "" Then
                        FeldPlazieren(X, Y + 1, Terrain)
                    Else
                        FeldPlazieren(X, Y + 1, Terrain, NurBeiUntergrund)
                    End If
                    FuellGrad += 1
                    If FuellGrad > LIM Then
                        Exit While
                    End If
                End If
            End If
            If Objektverwalter.Spielfeld.OnMap(X + 1, Y - 1) Then
                If R.Next(2) = 1 Then
                    If NurBeiUntergrund = "" Then
                        FeldPlazieren(X, Y - 1, Terrain)
                    Else
                        FeldPlazieren(X, Y - 1, Terrain, NurBeiUntergrund)
                    End If
                    FuellGrad += 1
                    If FuellGrad > LIM Then
                        Exit While
                    End If
                End If
            End If
            Spielbereich(X, Y) = True
            If FuellGrad > LIM Then Exit While
            Dim Found As Boolean = False
            For X1 = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y1 = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Spielbereich(X1, Y1) = False Then
                        If Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                            Landschaft = Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht)
                            X = X1
                            Y = Y1
                            Found = True
                            Exit For
                        End If
                    End If
                Next
                If Found = True Then Exit For
            Next
            If Found = False Then Exit While
        End While
        If cont = True Then
            For X1 = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y1 = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).getID <> Terrain Then
                        If Objektverwalter.Spielfeld.OnMap(X1 + 1, Y1) = False Then
                            If Objektverwalter.Spielfeld.OnMap(X1 - 1, Y1) = False Then
                                If Objektverwalter.Spielfeld.OnMap(X1, Y1 + 1) = False Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, Terrain)
                                    ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                        FeldPlazieren(X, Y, Terrain)
                                    End If
                                ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y - 1) = False Then
                                        FeldPlazieren(X, Y, Terrain)
                                    ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                        FeldPlazieren(X, Y, Terrain)
                                    End If
                                End If
                            ElseIf Objektverwalter.Spielfeld.Landschaften(X1 - 1, Y1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                If Objektverwalter.Spielfeld.OnMap(X1, Y1 + 1) = False Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, Terrain)
                                    ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                        FeldPlazieren(X, Y, Terrain)
                                    End If
                                ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, Terrain)
                                    ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                        FeldPlazieren(X, Y, Terrain)
                                    End If
                                End If
                            End If
                        ElseIf Objektverwalter.Spielfeld.Landschaften(X1 + 1, Y1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                            If Objektverwalter.Spielfeld.OnMap(X1 - 1, Y1) = False Then
                                If Objektverwalter.Spielfeld.OnMap(X1, Y1 + 1) = False Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, Terrain)
                                    ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                        FeldPlazieren(X, Y, Terrain)
                                    End If
                                ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, Terrain)
                                    ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                        FeldPlazieren(X, Y, Terrain)
                                    End If
                                End If
                            ElseIf Objektverwalter.Spielfeld.Landschaften(X1 - 1, Y1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                If Objektverwalter.Spielfeld.OnMap(X1, Y1 + 1) = False Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, Terrain)
                                    ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                        FeldPlazieren(X, Y, Terrain)
                                    End If
                                ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, Terrain)
                                    ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                        FeldPlazieren(X, Y, Terrain)
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        End If
    End Sub
    ''' <summary>
    ''' Plaziert eine Landschaften nach dem Zufallsgenerator.
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="ID"></param>
    ''' <remarks></remarks>
    Private Shared Sub FeldPlazieren(ByVal X As Integer, ByVal Y As Integer, ByVal ID As Integer)
        If ID >= 10 And ID <= 14 Or ID = 17 Then
            Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht) = New ObjektLandschaft(Objektverwalter.LandschaftenBilder(0).ID, X, Y, Objektverwalter.Spielfeld)
            Select Case ID
                Case 10
                    Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude = ObjektLadeklasse.NewGebaeude("STADT", 0, X, Y)

            End Select
        Else
            Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht) = New ObjektLandschaft(Objektverwalter.LandschaftenBilder(ID).ID, X, Y, Objektverwalter.Spielfeld)
        End If
    End Sub
    ''' <summary>
    ''' Plaziert eine Landschaften nach dem Zufallsgenerator.
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="ID"></param>
    ''' <remarks></remarks>
    Private Shared Sub FeldPlazieren(ByVal X As Integer, ByVal Y As Integer, ByVal ID As String)
        Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht) = New ObjektLandschaft(ID, X, Y, Objektverwalter.Spielfeld)
    End Sub
    Private Shared Function FindID(ByVal ID As String) As Integer
        For I = 0 To LandschaftenBilder.Length - 1
            If LandschaftenBilder(I).ID = ID Then
                Return I
            End If
        Next
        Return -1
    End Function
    ''' <summary>
    ''' Plaziert ein paar Riffe.
    ''' </summary>
    ''' <param name="RiffZahl"></param>
    ''' <remarks></remarks>
    Private Shared Sub PlaceRiff(ByVal RiffZahl As Integer, ByVal R As Random)
        'Konstante Riff
        Dim Riff As Integer = 7
        Dim RiffMoeglichkeit As New Stack(Of Point)
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                If GetLandschaftsID(X, Y, ObjektSpielfeld.Bodenschlacht) = "SEE" Then
                    Dim Moeglich As Integer = 0
                    Dim X1 As Integer = X
                    Dim Y1 As Integer = Y
                    For I = 0 To 7
                        Select Case I
                            Case 0
                                X1 -= 1
                                Y1 -= 1
                            Case 1
                                X1 += 1
                            Case 2
                                X1 += 1
                            Case 3
                                Y1 += 1
                            Case 4
                                Y1 += 1
                            Case 5
                                X1 -= 1
                            Case 6
                                X1 -= 1
                            Case 7
                                Y1 -= 1
                        End Select
                        If Objektverwalter.Spielfeld.OnMap(X1, Y1) = True Then
                            If Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).getID = "SEE" Or Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).getID = "STRAND" Or Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).getID = "BRUECKE" Or Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).getID = "ZUGBRUECKE" Then
                                Moeglich += 1
                            End If
                        End If
                    Next
                    If Moeglich = 8 Then
                        RiffMoeglichkeit.Push(New Point(X, Y))
                    End If
                End If
            Next
        Next
        Dim Plaziert As Integer = 0
        For I = 0 To RiffZahl
            If Plaziert >= RiffMoeglichkeit.Count Then Exit For
            If R.Next(50) < 35 Then
                Dim Ort As Integer = R.Next(RiffMoeglichkeit.Count - 1)
                FeldPlazieren(RiffMoeglichkeit(Ort).X, RiffMoeglichkeit(Ort).Y, Riff)
            End If
        Next
    End Sub
    ''' <summary>
    ''' Plaziert ein bestimmtes Terrain wenn der Untergrunf es zu laesst.
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="Terrain"></param>
    ''' <param name="Untergrund"></param>
    ''' <remarks></remarks>
    Private Shared Sub FeldPlazieren(ByVal X As Integer, ByVal Y As Integer, ByVal Terrain As Integer, ByVal Untergrund As String)
        If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).getID = Untergrund Then
            FeldPlazieren(X, Y, Terrain)
        End If
    End Sub
    Private Shared Sub FeldPlazieren(ByVal X As Integer, ByVal Y As Integer, ByVal Terrain As String, ByVal Untergrund As String)
        If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).getID = Untergrund Then
            FeldPlazieren(X, Y, Terrain)
        End If
    End Sub
    ''' <summary>
    ''' Erschafft eine Area und sucht dabei ein Startfeld fuer die Area aus.
    ''' </summary>
    ''' <param name="LIM"></param>
    ''' <param name="Cont"></param>
    ''' <param name="Untergrund"></param>
    ''' <remarks></remarks>
    Private Shared Sub PlaceAreaTerrain(ByVal Terrain As String, ByVal LIM As Integer, ByVal Cont As Boolean, ByVal R As Random, Optional ByVal Untergrund As String = "EBENE")
        Dim Moeglichkeit As New Stack(Of Point)
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).getID = Untergrund Then
                    Moeglichkeit.Push(New Point(X, Y))
                End If
            Next
        Next
        Dim Ort As Point = Moeglichkeit(R.Next(0, Moeglichkeit.Count - 1))
        BereichFuellen(Ort.X, Ort.Y, Terrain, LIM, Cont, Untergrund, R)
    End Sub
    ''' <summary>
    ''' Erschafft eine Area um ein bestimmtes Startfeld
    ''' </summary>
    ''' <param name="X3"></param>
    ''' <param name="Y3"></param>
    ''' <param name="LIM"></param>
    ''' <param name="Cont"></param>
    ''' <param name="NurBeiUntergrund"></param>
    ''' <remarks></remarks>
    Private Shared Sub BereichFuellen(ByVal X3 As Integer, ByVal Y3 As Integer, ByVal Terrain As String, ByVal LIM As Integer, ByVal Cont As Boolean, ByVal NurBeiUntergrund As String, ByVal R As Random)
        'Plaziert eimal die Landschaft
        Dim FuellGrad As Integer = 0
        Dim r1 As Integer = X3
        Dim r2 As Integer = Y3
        FeldPlazieren(r1, r2, Terrain)
        FuellGrad += 1
        'Fuellt die Landschaft aus.
        Dim Spielbereich(Objektverwalter.Spielfeld.Breite - 1, Objektverwalter.Spielfeld.Hoehe - 1) As Boolean
        For X1 = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y1 = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                If Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                    Spielbereich(X1, Y1) = True
                End If
            Next
        Next
        Dim Landschaft As ObjektLandschaft = Objektverwalter.Spielfeld.Landschaften(r1, r2, ObjektSpielfeld.Bodenschlacht)
        Dim X As Integer = r1
        Dim Y As Integer = r2
        While Not Landschaft Is Nothing
            If Objektverwalter.Spielfeld.OnMap(X + 1, Y) Then
                If R.Next(2) = 1 Then
                    If NurBeiUntergrund = "" Then
                        FeldPlazieren(X + 1, Y, Terrain)
                    Else
                        FeldPlazieren(X + 1, Y, Terrain, NurBeiUntergrund)
                    End If
                    FuellGrad += 1
                    If FuellGrad > LIM Then
                        Exit While
                    End If
                End If
            End If
            If Objektverwalter.Spielfeld.OnMap(X - 1, Y) Then
                If R.Next(2) = 1 Then
                    If NurBeiUntergrund = "" Then
                        FeldPlazieren(X - 1, Y, Terrain)
                    Else
                        FeldPlazieren(X - 1, Y, Terrain, NurBeiUntergrund)
                    End If
                    FuellGrad += 1
                    If FuellGrad > LIM Then
                        Exit While
                    End If
                End If
            End If
            If Objektverwalter.Spielfeld.OnMap(X, Y + 1) Then
                If R.Next(2) = 1 Then
                    If NurBeiUntergrund = "" Then
                        FeldPlazieren(X, Y + 1, Terrain)
                    Else
                        FeldPlazieren(X, Y + 1, Terrain, NurBeiUntergrund)
                    End If
                    FuellGrad += 1
                    If FuellGrad > LIM Then
                        Exit While
                    End If
                End If
            End If
            If Objektverwalter.Spielfeld.OnMap(X + 1, Y - 1) Then
                If R.Next(2) = 1 Then
                    If NurBeiUntergrund = "" Then
                        FeldPlazieren(X, Y - 1, Terrain)
                    Else
                        FeldPlazieren(X, Y - 1, Terrain, NurBeiUntergrund)
                    End If
                    FuellGrad += 1
                    If FuellGrad > LIM Then
                        Exit While
                    End If
                End If
            End If
            Spielbereich(X, Y) = True
            If FuellGrad > LIM Then Exit While
            Dim Found As Boolean = False
            For X1 = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y1 = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Spielbereich(X1, Y1) = False Then
                        If Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                            Landschaft = Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht)
                            X = X1
                            Y = Y1
                            Found = True
                            Exit For
                        End If
                    End If
                Next
                If Found = True Then Exit For
            Next
            If Found = False Then Exit While
        End While
        If Cont = True Then
            For X1 = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y1 = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Objektverwalter.Spielfeld.Landschaften(X1, Y1, ObjektSpielfeld.Bodenschlacht).getID <> Terrain Then
                        If Objektverwalter.Spielfeld.OnMap(X1 + 1, Y1) = False Then
                            If Objektverwalter.Spielfeld.OnMap(X1 - 1, Y1) = False Then
                                If Objektverwalter.Spielfeld.OnMap(X1, Y1 + 1) = False Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, Terrain)
                                    ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                        FeldPlazieren(X, Y, Terrain)
                                    End If
                                ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y - 1) = False Then
                                        FeldPlazieren(X, Y, Terrain)
                                    ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                        FeldPlazieren(X, Y, Terrain)
                                    End If
                                End If
                            ElseIf Objektverwalter.Spielfeld.Landschaften(X1 - 1, Y1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                If Objektverwalter.Spielfeld.OnMap(X1, Y1 + 1) = False Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, Terrain)
                                    ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                        FeldPlazieren(X, Y, Terrain)
                                    End If
                                ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, Terrain)
                                    ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                        FeldPlazieren(X, Y, Terrain)
                                    End If
                                End If
                            End If
                        ElseIf Objektverwalter.Spielfeld.Landschaften(X1 + 1, Y1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                            If Objektverwalter.Spielfeld.OnMap(X1 - 1, Y1) = False Then
                                If Objektverwalter.Spielfeld.OnMap(X1, Y1 + 1) = False Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, Terrain)
                                    ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                        FeldPlazieren(X, Y, Terrain)
                                    End If
                                ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, Terrain)
                                    ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                        FeldPlazieren(X, Y, Terrain)
                                    End If
                                End If
                            ElseIf Objektverwalter.Spielfeld.Landschaften(X1 - 1, Y1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                If Objektverwalter.Spielfeld.OnMap(X1, Y1 + 1) = False Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, Terrain)
                                    ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                        FeldPlazieren(X, Y, Terrain)
                                    End If
                                ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                    If Objektverwalter.Spielfeld.OnMap(X1, Y1 - 1) = False Then
                                        FeldPlazieren(X, Y, Terrain)
                                    ElseIf Objektverwalter.Spielfeld.Landschaften(X1, Y1 - 1, ObjektSpielfeld.Bodenschlacht).getID = Terrain Then
                                        FeldPlazieren(X, Y, Terrain)
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        End If
    End Sub
    ''' <summary>
    ''' Erstellt die Gebaeude unserer Zufallskarte und verbindet falls gewuenscht die HQs mit einer Strasse
    ''' </summary>
    ''' <remarks></remarks>
    Private Shared Sub CreateGebaeude(ByVal AnzahlderGebaeude As Integer, ByVal Strassenkreis As Boolean, ByVal R As Random, Optional ByVal KeineHaefen As Boolean = False)
        Dim MaximaleVersuche As Integer = 1000
        Dim Basen(Objektverwalter.Spielfeld.Spieler.Length - 2) As Point
        Dim MinmalAbstand As Integer = (Objektverwalter.Spielfeld.Breite + Objektverwalter.Spielfeld.Hoehe) / (Basen.Length)
        For I = 0 To Basen.Length - 1
            Dim Ort As Point
            Dim Durchgaenge As Integer = 0
            While True
                Durchgaenge += 1
                Ort = New Point(R.Next(Objektverwalter.Spielfeld.Breite - 1), R.Next(Objektverwalter.Spielfeld.Hoehe - 1))
                If Durchgaenge > 1000 Then
                    If ContainsFeld(Basen, Ort) = False Then
                        Exit While
                    End If
                End If
                For I2 = 0 To I
                    If Math.Abs(Basen(I2).X - Ort.X) + Math.Abs(Basen(I2).Y - Ort.Y) < MinmalAbstand Then
                        Continue While
                    End If
                Next
                Exit While
            End While
            Basen(I) = Ort
            PlaceGebaeude(Ort.X, Ort.Y, "HQ", I + 1)
        Next
        AnzahlderGebaeude -= Basen.Length
        'Jetzt bekommt jeder Spieler ersteinmal 1 Basis
        For I = 0 To Basen.Length - 1
            Dim X As Integer
            Dim Y As Integer
            Do
                X = R.Next(-2, 2) + Basen(I).X
                Y = R.Next(-2, 2) + Basen(I).Y
            Loop While OhneGebaeude(X, Y, ObjektSpielfeld.Bodenschlacht) = False
            PlaceGebaeude(X, Y, "BASIS", I + 1)
        Next
        AnzahlderGebaeude -= Basen.Length
        'So viele Basen werden plaziert
        Dim BasenZahl As Integer = AnzahlderGebaeude * 0.2#
        'Am Anfang soll jeder Spieler 4 Basen haben
        For I = 0 To 2
            If BasenZahl - Basen.Length >= 0 Then
                For I2 = 0 To Basen.Length - 1
                    PlaceBuildingRandomUmOrt(Basen(I2), "BASIS", 3, I2 + 1, R)
                Next
                BasenZahl -= Basen.Length
            Else
                Exit For
            End If
        Next
        For I = 1 To BasenZahl
            Dim Ort As Point
            Do
                Ort = New Point(R.Next(Objektverwalter.Spielfeld.Breite - 1), R.Next(Objektverwalter.Spielfeld.Hoehe - 1))
            Loop While OhneGebaeude(Ort.X, Ort.Y, ObjektSpielfeld.Bodenschlacht) = False
            PlaceGebaeude(Ort.X, Ort.Y, "BASIS", 0)
        Next
        BasenZahl = 0
        'So viele Flughaefen werden plaziert
        Dim FlughafenZahl As Integer = AnzahlderGebaeude * 0.1#
        For I = 0 To 1
            If FlughafenZahl - Basen.Length >= 0 Then
                For I2 = 0 To Basen.Length - 1
                    PlaceBuildingRandomUmOrt(Basen(I2), "FLUGHAFEN", 3, I2 + 1, R)
                Next
                FlughafenZahl -= Basen.Length
            Else
                Exit For
            End If
        Next
        For I = 1 To FlughafenZahl
            Dim Ort As Point
            Do
                Ort = New Point(R.Next(Objektverwalter.Spielfeld.Breite - 1), R.Next(Objektverwalter.Spielfeld.Hoehe - 1))
            Loop While OhneGebaeude(Ort.X, Ort.Y, ObjektSpielfeld.Bodenschlacht) = False
            PlaceGebaeude(Ort.X, Ort.Y, "FLUGHAFEN", 0)
        Next
        FlughafenZahl = 0
        'So viele Staedte werden plaziert
        Dim StadtZahl As Integer = AnzahlderGebaeude * 0.6#
        BasenZahl = StadtZahl * 0.3#
        Dim Rest As Integer
        Dim Max As Integer = Math.DivRem(BasenZahl, Basen.Length, Rest)
        StadtZahl = StadtZahl - Max * Basen.Length + Rest
        Dim I3 As Integer = 0
        For I = 1 To Max
            For I2 = 0 To Basen.Length - 1
                If I3 < 3 Then
                    PlaceBuildingRandomUmOrt(Basen(I2), "STADT", 5, I2 + 1, R)
                Else
                    Dim Ort As Point
                    Do
                        Ort = New Point(R.Next(Objektverwalter.Spielfeld.Breite - 1), R.Next(Objektverwalter.Spielfeld.Hoehe - 1))
                    Loop While OhneGebaeude(Ort.X, Ort.Y, ObjektSpielfeld.Bodenschlacht) = False
                    PlaceGebaeude(Ort.X, Ort.Y, "STADT", I2 + 1)
                End If
            Next
            I3 += 1
        Next
        For I = 1 To StadtZahl
            Dim Ort As Point
            Do
                Ort = New Point(R.Next(Objektverwalter.Spielfeld.Breite - 1), R.Next(Objektverwalter.Spielfeld.Hoehe - 1))
            Loop While OhneGebaeude(Ort.X, Ort.Y, ObjektSpielfeld.Bodenschlacht) = False
            PlaceGebaeude(Ort.X, Ort.Y, "STADT", 0)
        Next
        'So wir haben alle Gebaeude plaziert
        'So jetzt erstellen wir noch einen Strassenkreis
        If Strassenkreis = True Then
            For I = 0 To Basen.Length - 1
                Dim Startpunkt As Point = Basen(I)
                Dim EndPunkt As New Point
                If I = Basen.Length - 1 Then
                    EndPunkt = Basen(0)
                Else
                    EndPunkt = Basen(I + 1)
                End If
                CreateStrasse(Startpunkt, EndPunkt, R)
                AktuallisiereStrassen()
            Next
        End If
        'So viele Haefen werden plaziert
        Dim HafenZahl As Integer = AnzahlderGebaeude * 0.1#
        'Und dort koennen sie plaziert werden
        Dim HafenMoeglichkeiten As New Stack(Of Point)
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                If IsEinAngrenzendesFeld(X, Y, "SEE", ObjektSpielfeld.Bodenschlacht) = True Then
                    If OhneGebaeude(X, Y, ObjektSpielfeld.Bodenschlacht) = True Then
                        If GetLandschaftsID(X, Y, ObjektSpielfeld.Bodenschlacht) <> "SEE" Then
                            HafenMoeglichkeiten.Push(New Point(X, Y))
                        End If
                    End If
                End If
            Next
        Next
        If Not KeineHaefen Then
            'Jeder Spieler erhaelt maximal einen Hafen.
            If HafenZahl - Basen.Length >= 0 Then
                For I2 = 0 To Basen.Length - 1
                    Dim Ort As Point
                    Dim Stelle As Integer = -1
                    Dim Durchlaeufe As Integer = 0
                    If HafenMoeglichkeiten.Count <= 0 Then
                        Do
                            Ort = New Point(R.Next(Objektverwalter.Spielfeld.Breite - 1), R.Next(Objektverwalter.Spielfeld.Hoehe - 1))
                            Durchlaeufe += 1
                        Loop While OhneGebaeude(Ort.X, Ort.Y, ObjektSpielfeld.Bodenschlacht) = False And GetDistance(Basen(I2), Ort) > 10 Or Durchlaeufe < MaximaleVersuche
                    Else
                        Do
                            Stelle = R.Next(HafenMoeglichkeiten.Count - 1)
                            Ort = HafenMoeglichkeiten(Stelle)
                            Durchlaeufe += 1
                        Loop While GetDistance(Basen(I2), Ort) > 10 Or Durchlaeufe < MaximaleVersuche

                    End If
                    PlaceGebaeude(Ort.X, Ort.Y, "WERFT", I2 + 1)
                    If HafenMoeglichkeiten.Count > 0 Then
                        HafenMoeglichkeiten = PopFeld(HafenMoeglichkeiten, Stelle)
                    End If
                Next
                HafenZahl -= Basen.Length
            End If

            For I = 1 To HafenZahl
                Dim Ort As Point
                Dim Stelle As Integer = -1
                If HafenMoeglichkeiten.Count <= 0 Then
                    Do
                        Ort = New Point(R.Next(Objektverwalter.Spielfeld.Breite - 1), R.Next(Objektverwalter.Spielfeld.Hoehe - 1))
                    Loop While OhneGebaeude(Ort.X, Ort.Y, ObjektSpielfeld.Bodenschlacht) = False
                Else
                    Stelle = R.Next(HafenMoeglichkeiten.Count - 1)
                    Ort = HafenMoeglichkeiten(Stelle)
                End If
                PlaceGebaeude(Ort.X, Ort.Y, "WERFT", 0)
                If HafenMoeglichkeiten.Count > 0 Then
                    HafenMoeglichkeiten = PopFeld(HafenMoeglichkeiten, Stelle)
                End If
            Next
        End If
    End Sub
    ''' <summary>
    ''' Plaziert ein Gebaeude Zufaellig um einen Ort herum so lange auf dem Feld kein Gebaeude steht.
    ''' </summary>
    ''' <param name="Ort"></param>
    ''' <param name="GebaeudeID"></param>
    ''' <param name="Radius"></param>
    ''' <param name="Spieler"></param>
    ''' <remarks></remarks>
    Private Shared Sub PlaceBuildingRandomUmOrt(ByVal Ort As Point, ByVal GebaeudeID As String, ByVal Radius As Integer, ByVal Spieler As Integer, ByVal R As Random)
        Dim X As Integer
        Dim Y As Integer
        Do
            X = R.Next(-Radius, Radius) + Ort.X
            Y = R.Next(-Radius, Radius) + Ort.Y
        Loop While OhneGebaeude(X, Y, ObjektSpielfeld.Bodenschlacht) = False
        PlaceGebaeude(X, Y, GebaeudeID, Spieler)
    End Sub
    ''' <summary>
    ''' Plaziert ein Gebaeude
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="ID"></param>
    ''' <param name="Spieler"></param>
    ''' <remarks></remarks>
    Private Shared Sub PlaceGebaeude(ByVal X As Integer, ByVal Y As Integer, ByVal ID As String, ByVal Spieler As Integer)
        FeldPlazieren(X, Y, "EBENE")
        Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude = ObjektLadeklasse.NewGebaeude(ID, Spieler, X, Y)
    End Sub
    Private Shared Function ContainsFeld(ByVal Felder() As Point, ByVal P As Point)
        For Each P1 In Felder
            If P1.X = P.X And P1.Y = P.Y Then
                Return True
            End If
        Next
        Return False
    End Function
    Private Shared Function OhneGebaeude(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer) As Boolean
        If Objektverwalter.Spielfeld.OnMap(X, Y) = True Then
            If Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Gebaeude Is Nothing Then
                Return True
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function
    Private Shared Function IsEinAngrenzendesFeld(ByVal X As Integer, ByVal Y As Integer, ByVal ID As String, ByVal Schlacht As Integer) As Boolean
        Dim X2 As Integer = X
        Dim Y2 As Integer = Y
        For I = 0 To 3
            Select Case I
                Case 0
                    X2 -= 1
                Case 1
                    X2 += 1
                    Y2 -= 1
                Case 2
                    X2 += 1
                    Y2 += 1
                Case 3
                    X2 -= 1
                    Y2 += 1
            End Select
            If Objektverwalter.Spielfeld.OnMap(X2, Y2) = True Then
                If Objektverwalter.Spielfeld.Landschaften(X2, Y2, Schlacht).getID = ID Then
                    Return True
                End If
            End If
        Next
        Return False
    End Function
    ''' <summary>
    ''' Erstellt eine Strasse zwischen 2 Punkten
    ''' </summary>
    ''' <param name="Start"></param>
    ''' <param name="Ende"></param>
    ''' <remarks></remarks>
    Private Shared Sub CreateStrasse(ByVal Start As Point, ByVal Ende As Point, ByVal R As Random)
        'Ein paar Konstanten
        Dim Bruecke As Integer = ObjektLandschaftsTextur.GetID("BRUECKE")
        Dim Strasse As Integer = ObjektLandschaftsTextur.GetID("STRASSE")
        Dim Zugbruecke As Integer = ObjektLandschaftsTextur.GetID("ZUGBRUECKE")
        'Wir berechnen den Weg der Strasse
        Dim WSS As New Wegsuchsystem(ObjektLadeklasse.NewEinheit("BOMBER", 0, Start.X, Start.Y, False), Start.X, Start.Y, 0, -1)
        If R.Next(0, 9) > 3 Then
            WSS.Ziel(Ende.X, Ende.Y, ObjektSpielfeld.Bodenschlacht, True, R, False)
        Else
            WSS.Ziel(Ende.X, Ende.Y, ObjektSpielfeld.Bodenschlacht, True, , False)
        End If
        For I = 0 To WSS.WegpunkteX.Length - 1
            'Wir plazieren die Strasse
            If GetLandschaftsID(WSS.WegpunkteX(I), WSS.WegpunkteY(I), ObjektSpielfeld.Bodenschlacht) = "SEE" Then
                If I > 0 And I < WSS.WegpunkteX.Length - 1 Then
                    If WSS.WegpunkteX(I - 1) = WSS.WegpunkteX(I) And WSS.WegpunkteX(I) = WSS.WegpunkteX(I + 1) Then
                        If Objektverwalter.Spielfeld.OnMap(WSS.WegpunkteX(I), WSS.WegpunkteY(I) - 1) = True Then
                            If GetLandschaftsID(WSS.WegpunkteX(I), WSS.WegpunkteY(I) - 1, ObjektSpielfeld.Bodenschlacht) = "SEE" Then
                                If Objektverwalter.Spielfeld.OnMap(WSS.WegpunkteX(I), WSS.WegpunkteY(I) + 1) = True Then
                                    If GetLandschaftsID(WSS.WegpunkteX(I), WSS.WegpunkteY(I) + 1, ObjektSpielfeld.Bodenschlacht) = "SEE" Then
                                        If GetLandschaftsID(WSS.WegpunkteX(I - 1), WSS.WegpunkteY(I - 1), ObjektSpielfeld.Bodenschlacht) = "BRUECKE" And GetLandschaftsID(WSS.WegpunkteX(I + 1), WSS.WegpunkteY(I + 1), ObjektSpielfeld.Bodenschlacht) = "SEE" Or GetLandschaftsID(WSS.WegpunkteX(I + 1), WSS.WegpunkteY(I + 1), ObjektSpielfeld.Bodenschlacht) = "BRUECKE" Or GetLandschaftsID(WSS.WegpunkteX(I + 1), WSS.WegpunkteY(I + 1), ObjektSpielfeld.Bodenschlacht) = "ZUGBRUECKE" Then
                                            FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Zugbruecke)
                                        Else
                                            FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Bruecke)
                                        End If
                                    Else
                                        FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Bruecke)
                                    End If
                                Else
                                    FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Bruecke)
                                End If
                            Else
                                FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Bruecke)
                            End If
                        Else
                            FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Bruecke)
                        End If
                    ElseIf WSS.WegpunkteY(I - 1) = WSS.WegpunkteY(I) And WSS.WegpunkteY(I) = WSS.WegpunkteY(I + 1) Then
                        If Objektverwalter.Spielfeld.OnMap(WSS.WegpunkteX(I) - 1, WSS.WegpunkteY(I)) = True Then
                            If GetLandschaftsID(WSS.WegpunkteX(I) - 1, WSS.WegpunkteY(I), ObjektSpielfeld.Bodenschlacht) = "SEE" Then
                                If Objektverwalter.Spielfeld.OnMap(WSS.WegpunkteX(I) + 1, WSS.WegpunkteY(I)) = True Then
                                    If GetLandschaftsID(WSS.WegpunkteX(I), WSS.WegpunkteY(I) + 1, ObjektSpielfeld.Bodenschlacht) = "SEE" Then
                                        If GetLandschaftsID(WSS.WegpunkteX(I - 1), WSS.WegpunkteY(I - 1), ObjektSpielfeld.Bodenschlacht) = "BRUECKE" And GetLandschaftsID(WSS.WegpunkteX(I + 1), WSS.WegpunkteY(I + 1), ObjektSpielfeld.Bodenschlacht) = "SEE" Or GetLandschaftsID(WSS.WegpunkteX(I + 1), WSS.WegpunkteY(I + 1), ObjektSpielfeld.Bodenschlacht) = "BRUECKE" Or GetLandschaftsID(WSS.WegpunkteX(I + 1), WSS.WegpunkteY(I + 1), ObjektSpielfeld.Bodenschlacht) = "ZUGBRUECKE" Then
                                            FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Zugbruecke)
                                        Else
                                            FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Bruecke)
                                        End If
                                    Else
                                        FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Bruecke)
                                    End If
                                Else
                                    FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Bruecke)
                                End If
                            Else
                                FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Bruecke)
                            End If
                        Else
                            FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Bruecke)
                        End If
                    Else
                        FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Bruecke)
                    End If
                Else
                    FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Bruecke)
                End If
            Else
                If OhneGebaeude(WSS.WegpunkteX(I), WSS.WegpunkteY(I), ObjektSpielfeld.Bodenschlacht) = True Then
                    FeldPlazieren(WSS.WegpunkteX(I), WSS.WegpunkteY(I), Strasse)
                End If
            End If
        Next
    End Sub
    Private Shared Function GetLandschaftsID(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer) As String
        Return Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).getID
    End Function
    Private Shared Sub AktuallisiereStrassen()
        Dim Bruecke As Integer = 4
        Dim Strasse As Integer = 3
        UebergaengeAktualiesieren()
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                If GetLandschaftsID(X, Y, ObjektSpielfeld.Bodenschlacht) = "ZUGBRUECKE" Then
                    If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).BildID < 0 Then
                        FeldPlazieren(X, Y, Bruecke)
                    End If
                End If
                If GetLandschaftsID(X, Y, ObjektSpielfeld.Bodenschlacht) = "BRUECKE" Then
                    If CountAngrenzendeLandschaften(X, Y, "SEE", ObjektSpielfeld.Bodenschlacht) <= 1 Then
                        FeldPlazieren(X, Y, Strasse)
                    End If
                End If
            Next
        Next
    End Sub
    Private Shared Function CountAngrenzendeLandschaften(ByVal X As Integer, ByVal Y As Integer, ByVal ID As String, ByVal Schlacht As Integer) As Integer
        Dim Anzahl As Integer = 0
        Dim X2 As Integer = X
        Dim Y2 As Integer = Y
        For I = 0 To 3
            Select Case I
                Case 0
                    X2 -= 1
                Case 1
                    X2 += 1
                    Y2 -= 1
                Case 2
                    X2 += 1
                    Y2 += 1
                Case 3
                    X2 -= 1
                    Y2 += 1
            End Select
            If Objektverwalter.Spielfeld.OnMap(X2, Y2) = True Then
                If Objektverwalter.Spielfeld.Landschaften(X2, Y2, Schlacht).getID = ID Then
                    Anzahl += 1
                End If
            End If
        Next
        Return Anzahl
    End Function
    Private Shared Sub PlaceStraende(ByVal Ran As Random)
        Dim StrandMoeglichkeiten As New Stack(Of Point)
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                If GetLandschaftsID(X, Y, ObjektSpielfeld.Bodenschlacht) = "SEE" Then
                    'So das Feld ist See
                    Dim R As Integer = 4 - CountAngrenzendeLandschaften(X, Y, "SEE", ObjektSpielfeld.Bodenschlacht)
                    R -= CountAngrenzendeLandschaften(X, Y, "BRUECKE", ObjektSpielfeld.Bodenschlacht)
                    R -= CountAngrenzendeLandschaften(X, Y, "ZUGBRUECKE", ObjektSpielfeld.Bodenschlacht)
                    If R > 0 Then
                        'Mindestens ein Angrenzendes Feld ist nicht See wir koennen einen Strand plazieren
                        StrandMoeglichkeiten.Push(New Point(X, Y))
                    End If
                End If
            Next
        Next
        For I = 0 To StrandMoeglichkeiten.Count - 1
            If Ran.Next(0, 40) < 15 Then
                FeldPlazieren(StrandMoeglichkeiten(I).X, StrandMoeglichkeiten(I).Y, "STRAND")
            End If
        Next
    End Sub
    Private Shared Function ExistFeld(ByVal Felder() As Point, ByVal P As Point) As Boolean
        For Each P2 In Felder
            If P2.X = P.X And P2.Y = P.Y Then
                Return True
            End If
        Next
        Return False
    End Function
    Private Shared Function PopFeld(ByRef Felder As Stack(Of Point), ByVal Ort As Integer)
        Dim F As New Stack(Of Point)
        For I = 0 To Felder.Count - 1
            If I <> Ort Then
                F.Push(Felder(I))
            End If
        Next
        Return F
    End Function
    Public Shared Function GenerateZufallskarteLuftschlacht(ByVal Schlacht As ObjektSpielfeld) As ObjektSpielfeld
        Dim Schlacht2 As New ObjektSpielfeld(Schlacht.Breite, Schlacht.Hoehe, Schlacht.Spieler, Schlacht.Regeln)
        Dim Wolkenfelder As Integer = Zufallszahl(Schlacht.Breite * Schlacht.Hoehe * 8 / 100, Schlacht.Breite * Schlacht.Hoehe * 12 / 100)
        For X = 0 To Schlacht.Breite - 1
            For Y = 0 To Schlacht.Hoehe - 1
                Schlacht2.Landschaften(X, Y, 0) = Schlacht.Landschaften(X, Y, 0)
                Schlacht2.Einheiten(X, Y, 0) = Schlacht.Einheiten(X, Y, 0)
            Next
        Next
        For I = 0 To Wolkenfelder - 1
            Dim X As Integer = 0
            Dim Y As Integer = 0
            Do
                X = Zufallszahl(0, Schlacht2.Breite - 1)
                Y = Zufallszahl(0, Schlacht2.Hoehe - 1)
            Loop While Schlacht2.Landschaften(X, Y, 1).getID = "WOLKEN"
            Schlacht2.Landschaften(X, Y, 1) = New ObjektLandschaft("WOLKEN", X, Y, Schlacht2, Nothing)
        Next
        Return Schlacht2
    End Function
#End Region
#Region "Zufallskarte V2"
    Public Enum Abweichungsarten
        Linear
        Exponentiell
        Keine
    End Enum
    Public Shared Function ZufallskarteV2(ByVal Breite As Integer, ByVal Hoehe As Integer, ByVal Spieler() As ObjektSpieler, ByVal Regeln As ObjektRegeln, Optional ByVal Strassenkreis As Boolean = True, Optional ByVal StartVektor As Integer = -1, Optional ByVal Forestchance As Single = 0.0286, Optional ByVal MountainChance As Single = 0.0125, Optional ByVal Seachance As Single = 0.007024, Optional ByVal Buildingchance As Single = 0.1) As Integer
        'VORBEREITUNGEN:
        Dim R As Random
        If StartVektor < 0 Then
            StartVektor = Zufallszahl(0, Integer.MaxValue - 1)
            R = New Random(StartVektor)
        Else
            R = New Random(StartVektor)
        End If
        'erstmal alles loeschen, also in Ebene umwandeln
        Spielfeld = New ObjektSpielfeld(Breite, Hoehe, Spieler, Regeln)
        Zentrieren()

        'LANDSCHAFT ERSCHAFFEN:     
        If (Breite * Hoehe) * Forestchance < 1 And Forestchance > 0 Then
            GruppePlazieren(R.Next(0, Breite - 1), R.Next(0, Hoehe - 1), 7, "WALD", 2, R)
        Else
            'Waelder plazieren
            For Waelder = 1 To (Breite * Hoehe) * Forestchance
                GruppePlazieren(R.Next(0, Breite - 1), R.Next(0, Hoehe - 1), 7, "WALD", 2, R)
            Next
        End If



        If (Breite * Hoehe) * MountainChance < 1 And MountainChance > 0 Then
            GruppePlazieren(R.Next(0, Breite - 1), R.Next(0, Hoehe - 1), 10, "BERG", 2, R)
        Else
            'Gebirgszuege errichten
            For Terrain = 1 To (Breite * Hoehe) * MountainChance
                GruppePlazieren(R.Next(0, Breite - 1), R.Next(0, Hoehe - 1), 10, "BERG", 2, R)
            Next
        End If


        'Mit Wasser fluten
        If Breite * Hoehe * Seachance * 3 / 4 < 1 And Seachance > 0 Then
            GruppePlazieren(R.Next(0, Breite - 1), R.Next(0, Hoehe - 1), 20, "SEE", 1, R)
        Else
            For Terrain = 1 To (Breite * Hoehe) * Seachance * 3 / 4
                GruppePlazieren(R.Next(0, Breite - 1), R.Next(0, Hoehe - 1), 30, "SEE", 1, R)
            Next
            For Terrain = 1 To (Breite * Hoehe) * Seachance * 1 / 4
                GruppePlazieren(R.Next(0, Breite - 1), R.Next(0, Hoehe - 1), 7, "SEE", 1, R)
            Next
        End If

        'Straende und Riffe plazieren
        PlaceStraende(R)
        PlaceRiffe(R)



        'MENSCHLICHE EINGRIFFE BERECHNEN:
        'HQs plazieren
        Dim Tests As Single = 0
        Dim Startpos(Spieler.Length - 1) As Point
        For Sp = 1 To Spieler.Length - 1
            Dim KO() As ObjektKO = {ObjektLadeklasse.NewKO("ANDY", Sp), Nothing}
            Spielfeld.Spieler(Sp).KOS = KO
            Tests = 0
            Do
                Startpos(Sp).X = R.Next(0, Breite - 1)
                Startpos(Sp).Y = R.Next(0, Hoehe - 1)
                If Spielfeld.Landschaften(Startpos(Sp).X, Startpos(Sp).Y, 0).LandschaftsID = "EBENE" Or Spielfeld.Landschaften(Startpos(Sp).X, 2, 0).LandschaftsID = "WALD" Then
                    If getAnzahlBefahrbareFelder(Startpos(Sp).X, Startpos(Sp).Y, ObjektLadeklasse.NewEinheit("TTP", 1, Startpos(Sp).X, Startpos(Sp).Y, 10), 0) > 7 Then
                        'Gueltige Startposition gefunden

                        Exit Do
                    Else
                        Tests += 1
                        If Tests > 20 Then Exit Do
                    End If
                    Tests += 0.1#
                    If Tests > 20 Then Exit Do
                End If
            Loop
        Next
        'Basen und andere Produktionsgebaeude errichten

        'Staedte bauen

        'neutrale Gebaeude erschaffen
        Dim Felderprozent As Integer = Breite * Hoehe * Buildingchance
        'Strassennetz anlegen
        Dim MinGebaeude As Integer = ((Spieler.Length - 1) * 2)
        If Felderprozent < MinGebaeude Then
            Felderprozent = MinGebaeude
        End If
        'Wir plazieren die Gebaeude
        CreateGebaeude(Felderprozent, Strassenkreis, R, True)

        'LUFTSCHLACHT:


        'SCHLUSSBERECHNUNGEN:
        'Die ganzen Uebergaenge Grafisch aktuallisieren. (Am besten auch bei Leertaste :))
        UebergaengeAktualiesieren()
        Return StartVektor
    End Function
    Public Shared Sub GruppePlazieren(ByVal StartX As Integer, ByVal StartY As Integer, ByVal Anzahl As Integer, ByVal Landschaftstyp As String, ByVal RadiusAngrenzendeLandschaft As Integer, ByVal R As Random)
        GruppePlazieren(StartX, StartY, Anzahl, 0, Abweichungsarten.Keine, Landschaftstyp, RadiusAngrenzendeLandschaft, R)
    End Sub
    Public Shared Sub GruppePlazieren(ByVal StartX As Integer, ByVal StartY As Integer, ByVal Anzahl As Integer, ByVal AnzahlAbweichung As Integer, ByVal AnzahlAbweichungsart As Abweichungsarten, ByVal Landschaftstyp As String, ByVal RadiusAngrenzendeLandschaft As Integer, ByVal R As Random)
        Dim Punkte(99) As Point
        Dim PunkteMaxInd As Integer = 1
        Punkte(0) = New Point(StartX, StartY)

        While Anzahl > 0
            'Wir muessen noch landschaften plazieren
            Dim pInd As Integer = R.Next(0, PunkteMaxInd - 1)
            Landschaftplazieren(Punkte(pInd).X, Punkte(pInd).Y, Landschaftstyp)
            Anzahl -= 1

            addPunktLandschaft(Punkte, PunkteMaxInd, Punkte(pInd).X + 1, Punkte(pInd).Y, Landschaftstyp, RadiusAngrenzendeLandschaft - 1)
            addPunktLandschaft(Punkte, PunkteMaxInd, Punkte(pInd).X - 1, Punkte(pInd).Y, Landschaftstyp, RadiusAngrenzendeLandschaft - 1)
            addPunktLandschaft(Punkte, PunkteMaxInd, Punkte(pInd).X, Punkte(pInd).Y + 1, Landschaftstyp, RadiusAngrenzendeLandschaft - 1)
            addPunktLandschaft(Punkte, PunkteMaxInd, Punkte(pInd).X, Punkte(pInd).Y - 1, Landschaftstyp, RadiusAngrenzendeLandschaft - 1)

            Punkte(pInd) = Punkte(PunkteMaxInd - 1) 'Den Punkte, auf den wir gerade plaziert haben brauchen wir nicht mehr.
            PunkteMaxInd -= 1
            If PunkteMaxInd <= 0 Then
                Exit While 'Es scheint keine freien Felder mehr zu geben...
            End If
        End While

    End Sub
    Public Shared Sub addPunktLandschaft(ByRef punkte() As Point, ByRef PunkteMaxInd As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal Landschaftstyp As String, ByVal RadiusAngrenzendeLandschaft As Integer)
        If X < 0 Then Exit Sub
        If Y < 0 Then Exit Sub
        If X >= Spielfeld.Breite Then Exit Sub
        If Y >= Spielfeld.Hoehe Then Exit Sub

        For i = 0 To PunkteMaxInd - 1
            If punkte(i).X = X Then
                If punkte(i).Y = Y Then Exit Sub 'Diesen Punkt gibt es schon.
            End If
        Next

        If Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).LandschaftsID = Landschaftstyp Then Exit Sub
        'Kann dieses Terrain hier plaziert werden?
        For Each B In LandschaftenBilder
            If B.ID = Landschaftstyp Then
                If B.BildID(X, Y, Spielfeld) = -1 Then Exit Sub
                Exit For
            End If
        Next

        'In den Array hinzufuegen
        punkte(PunkteMaxInd) = New Point(X, Y)
        PunkteMaxInd += 1
        If PunkteMaxInd >= punkte.Length Then Array.Resize(punkte, punkte.Length + 100)

        If RadiusAngrenzendeLandschaft <= 0 Then Exit Sub
        addPunktLandschaft(punkte, PunkteMaxInd, X + 1, Y, Landschaftstyp, RadiusAngrenzendeLandschaft - 1)
        addPunktLandschaft(punkte, PunkteMaxInd, X - 1, Y, Landschaftstyp, RadiusAngrenzendeLandschaft - 1)
        addPunktLandschaft(punkte, PunkteMaxInd, X, Y + 1, Landschaftstyp, RadiusAngrenzendeLandschaft - 1)
        addPunktLandschaft(punkte, PunkteMaxInd, X, Y - 1, Landschaftstyp, RadiusAngrenzendeLandschaft - 1)
    End Sub
    Public Shared Sub LandschaftPlazieren(ByVal X As Integer, ByVal Y As Integer, ByVal TerrainID As String, Optional ByVal Pruefen As Boolean = False)
        If Pruefen Then

        End If
        Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht) = New ObjektLandschaft(TerrainID, X, Y, Objektverwalter.Spielfeld)
    End Sub
    Public Shared Function getAnzahlBefahrbareFelder(ByVal X As Integer, ByVal Y As Integer, ByVal Einheit As ObjektEinheit, ByVal Schlacht As Integer) As Integer
        Dim WSS As New Wegsuchsystem(Einheit, X, Y, Schlacht, , , Wegsuchsystem.SuchartenEinheiten.AlleEinheitenIgnorieren)
        Dim erreichbareFelder As Integer = 0
        For iX = 0 To Spielfeld.Breite - 1
            For iY = 0 To Spielfeld.Hoehe - 1
                If WSS.getBewegungspunktekosten(iX, iY, Schlacht) >= 0 Then
                    erreichbareFelder += 1
                    'Objektverwalter.Spielfeld.Einheiten(iX, iY, ObjektSpielfeld.Bodenschlacht) = ObjektLadeklasse.NewEinheit(Einheit.EinheitenID, 1, iX, iY, 100, False)
                End If
            Next
        Next
        Return erreichbareFelder
    End Function
    Private Shared Sub PlaceRiffe(ByVal Ran As Random)
        Dim StrandMoeglichkeiten As New Stack(Of Point)
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                If GetLandschaftsID(X, Y, ObjektSpielfeld.Bodenschlacht) = "SEE" Then
                    'So das Feld ist See
                    Dim R As Integer = CountAngrenzendeLandschaften(X, Y, "SEE", ObjektSpielfeld.Bodenschlacht)
                    R += CountAngrenzendeLandschaften(X, Y, "BRUECKE", ObjektSpielfeld.Bodenschlacht)
                    R += CountAngrenzendeLandschaften(X, Y, "ZUGBRUECKE", ObjektSpielfeld.Bodenschlacht)
                    If R = 4 Then
                        'Alle angrenzenden Felder sind gueltig.
                        StrandMoeglichkeiten.Push(New Point(X, Y))
                    End If
                End If
            Next
        Next
        For I = 0 To StrandMoeglichkeiten.Count - 1
            If Ran.Next(0, 40) < 25 Then
                FeldPlazieren(StrandMoeglichkeiten(I).X, StrandMoeglichkeiten(I).Y, "RIFF")
            End If
        Next
    End Sub
#End Region
#Region "Karte Transformieren"
    Public Shared Sub SpiegelnVertikal()
        Dim Menue As ObjektKarteneditormenue = Objektverwalter.Menue
        Dim Breite As Integer = Objektverwalter.Spielfeld.Breite * 2
        Dim Hoehe As Integer = Objektverwalter.Spielfeld.Hoehe
        Dim AlteBreite As Integer = Objektverwalter.Spielfeld.Breite
        Dim AlteHoehe As Integer = Objektverwalter.Spielfeld.Hoehe
        'wir vergroessern die Karte
        Menue.Karteveraendern(Breite, Hoehe, Objektverwalter.Spielfeld.Spieler.Length - 1, )
        'wir spiegeln die Karte
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To AlteBreite - 1
                For Y = 0 To AlteHoehe - 1
                    Dim X1 As Integer = Breite - X - 1
                    Dim Y1 As Integer = Y
                    Dim Terrain As String = Objektverwalter.Spielfeld.Landschaften(X, Y, I).LandschaftsID
                    Objektverwalter.Spielfeld.Landschaften(X1, Y1, I) = New ObjektLandschaft(Terrain, X1, Y1, Objektverwalter.Spielfeld, Nothing)
                    CloneUnit(X, Y, X1, Y1, I)
                Next
            Next
        Next
        For I = 0 To AnzahlSchlachten
            For X = 0 To AlteBreite - 1
                For Y = 0 To AlteHoehe - 1
                    Dim X1 As Integer = Breite - X - 1
                    Dim Y1 As Integer = Y
                    Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude
                    If Not G Is Nothing Then
                        If G.GetRealGebaeudeID <> "VERWEIS" Then
                            If G.GetRealGebaeudeID = "FESTUNG" Then
                                Objektverwalter.Spielfeld.Landschaften(X1 - 1, Y1, I).Gebaeude = ObjektLadeklasse.NewGebaeude(G.GebaeudeID, G.Spieler, G.KP, G.Besetzung, X1 - 1, Y1, G.Feuerbereit)
                            ElseIf G.GetRealGebaeudeID = "OMEGARAKETE" Then
                                Objektverwalter.Spielfeld.Landschaften(X1 - 1, Y1, I).Gebaeude = ObjektLadeklasse.NewGebaeude(G.GebaeudeID, G.Spieler, G.KP, G.Besetzung, X1 - 1, Y1, G.Feuerbereit)
                            ElseIf G.GetRealGebaeudeID = "FABRIK" Then
                                Objektverwalter.Spielfeld.Landschaften(X1, Y1, I).Gebaeude = ObjektLadeklasse.NewGebaeude(G.GebaeudeID, G.Spieler, G.KP, G.Besetzung, X1, Y1, G.Feuerbereit)
                            Else
                                Objektverwalter.Spielfeld.Landschaften(X1, Y1, I).Gebaeude = ObjektLadeklasse.NewGebaeude(G.GebaeudeID, G.Spieler, G.KP, G.Besetzung, X1, Y1, G.Feuerbereit)
                            End If
                        End If
                    End If
                Next
            Next
        Next
        UebergaengeAktualiesieren()
    End Sub
    Public Shared Sub SpiegelnHorizontal()
        Dim Menue As ObjektKarteneditormenue = Objektverwalter.Menue
        Dim Breite As Integer = Objektverwalter.Spielfeld.Breite
        Dim Hoehe As Integer = Objektverwalter.Spielfeld.Hoehe * 2
        Dim AlteBreite As Integer = Objektverwalter.Spielfeld.Breite
        Dim AlteHoehe As Integer = Objektverwalter.Spielfeld.Hoehe
        'wir vergroessern die Karte
        Menue.Karteveraendern(Breite, Hoehe, Objektverwalter.Spielfeld.Spieler.Length - 1, )
        'wir spiegeln die Karte
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To AlteBreite - 1
                For Y = 0 To AlteHoehe - 1
                    Dim X1 As Integer = X
                    Dim Y1 As Integer = Hoehe - Y - 1
                    Dim Terrain As String = Objektverwalter.Spielfeld.Landschaften(X, Y, I).LandschaftsID
                    Objektverwalter.Spielfeld.Landschaften(X1, Y1, I) = New ObjektLandschaft(Terrain, X1, Y1, Objektverwalter.Spielfeld, Nothing)
                    CloneUnit(X, Y, X1, Y1, I)
                Next
            Next
        Next
        For I = 0 To AnzahlSchlachten
            For X = 0 To AlteBreite - 1
                For Y = 0 To AlteHoehe - 1
                    Dim X1 As Integer = X
                    Dim Y1 As Integer = Hoehe - Y - 1
                    Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude
                    If Not G Is Nothing Then
                        If G.GetRealGebaeudeID <> "VERWEIS" Then
                            If G.GetRealGebaeudeID = "FESTUNG" Then
                                Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, I).Gebaeude = ObjektLadeklasse.NewGebaeude(G.GebaeudeID, G.Spieler, G.KP, G.Besetzung, X1, Y1 + 1, G.Feuerbereit)
                            ElseIf G.GetRealGebaeudeID = "OMEGARAKETE" Then
                                Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, I).Gebaeude = ObjektLadeklasse.NewGebaeude(G.GebaeudeID, G.Spieler, G.KP, G.Besetzung, X1, Y1 + 1, G.Feuerbereit)
                            ElseIf G.GetRealGebaeudeID = "FABRIK" Then
                                Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 2, I).Gebaeude = ObjektLadeklasse.NewGebaeude(G.GebaeudeID, G.Spieler, G.KP, G.Besetzung, X1, Y1 + 2, G.Feuerbereit)
                            Else
                                Objektverwalter.Spielfeld.Landschaften(X1, Y1, I).Gebaeude = ObjektLadeklasse.NewGebaeude(G.GebaeudeID, G.Spieler, G.KP, G.Besetzung, X1, Y1, G.Feuerbereit)
                            End If
                        End If
                    End If
                Next
            Next
        Next
        UebergaengeAktualiesieren()
    End Sub
    Public Shared Sub Drehen180()
        Dim Menue As ObjektKarteneditormenue = Objektverwalter.Menue
        Dim Breite As Integer = Objektverwalter.Spielfeld.Breite
        Dim Hoehe As Integer = Objektverwalter.Spielfeld.Hoehe
        Dim AnzahlSchlachten As Integer = 0
        Dim M As Double = (Hoehe - 1) / (0 - (Breite - 1))
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1

        For I = 0 To AnzahlSchlachten
            For X = 0 To Breite - 1
                Dim NeueHoehe As Integer = (M * X) + (Hoehe - 1) 'Drehgerade
                For Y = 0 To NeueHoehe - 1
                    Dim X1 As Single = Breite - 1 - X
                    Dim Y1 As Single = Hoehe - 1 - Y
                    If Spielfeld.OnMap(X1, Y1) Then
                        Dim Terrain As String = Objektverwalter.Spielfeld.Landschaften(X, Y, I).LandschaftsID
                        Objektverwalter.Spielfeld.Landschaften(X1, Y1, I) = New ObjektLandschaft(Terrain, X1, Y1, Objektverwalter.Spielfeld, Nothing)
                        CloneUnit(X, Y, X1, Y1, I)
                    End If
                Next
            Next
        Next
        For I = 0 To AnzahlSchlachten
            For X = 0 To Breite - 1
                Dim NeueHoehe As Integer = (M * X) + Hoehe - (M * 0)
                For Y = NeueHoehe - 1 To 0 Step -1
                    Dim X1 As Single = Breite - 1 - X
                    Dim Y1 As Single = Hoehe - 1 - Y
                    If Spielfeld.OnMap(X1, Y1) Then
                        Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude
                        If Not G Is Nothing Then
                            If G.GetRealGebaeudeID <> "VERWEIS" Then
                                If G.GetRealGebaeudeID = "FESTUNG" Then
                                    Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, I).Gebaeude = ObjektLadeklasse.NewGebaeude(G.GebaeudeID, G.Spieler, G.KP, G.Besetzung, X1, Y1 + 1, G.Feuerbereit)
                                ElseIf G.GetRealGebaeudeID = "OMEGARAKETE" Then
                                    Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, I).Gebaeude = ObjektLadeklasse.NewGebaeude(G.GebaeudeID, G.Spieler, G.KP, G.Besetzung, X1, Y1 + 1, G.Feuerbereit)
                                ElseIf G.GetRealGebaeudeID = "FABRIK" Then
                                    Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 2, I).Gebaeude = ObjektLadeklasse.NewGebaeude(G.GebaeudeID, G.Spieler, G.KP, G.Besetzung, X1, Y1 + 2, G.Feuerbereit)
                                Else
                                    Objektverwalter.Spielfeld.Landschaften(X1, Y1, I).Gebaeude = ObjektLadeklasse.NewGebaeude(G.GebaeudeID, G.Spieler, G.KP, G.Besetzung, X1, Y1, G.Feuerbereit)
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
        UebergaengeAktualiesieren()
    End Sub
    Public Shared Sub Drehen_180()
        Dim Menue As ObjektKarteneditormenue = Objektverwalter.Menue
        Dim Breite As Integer = Objektverwalter.Spielfeld.Breite
        Dim Hoehe As Integer = Objektverwalter.Spielfeld.Hoehe
        Dim AnzahlSchlachten As Integer = 0
        Dim M As Double = (Hoehe - 1) / (Breite - 1)

        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1

        For I = 0 To AnzahlSchlachten
            For X = 0 To Breite - 1
                Dim NeueHoehe As Integer = (M * X)
                For Y = 0 To NeueHoehe - 1
                    Dim X1 As Integer = Breite - 1 - X
                    Dim Y1 As Integer = Hoehe - 1 - Y
                    Dim Terrain As String = Objektverwalter.Spielfeld.Landschaften(X, Y, I).LandschaftsID
                    Objektverwalter.Spielfeld.Landschaften(X1, Y1, I) = New ObjektLandschaft(Terrain, X1, Y1, Objektverwalter.Spielfeld, Nothing)
                    CloneUnit(X, Y, X1, Y1, I)
                Next
            Next
        Next
        For I = 0 To AnzahlSchlachten
            For X = 0 To Breite - 1
                Dim NeueHoehe As Integer = (M * X) - (M * 0)
                For Y = 0 To NeueHoehe - 1
                    Dim X1 As Integer = Breite - 1 - X
                    Dim Y1 As Integer = Hoehe - 1 - Y
                    Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude
                    If Not G Is Nothing Then
                        If G.GetRealGebaeudeID <> "VERWEIS" Then
                            If G.GetRealGebaeudeID = "FESTUNG" Then
                                Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, I).Gebaeude = ObjektLadeklasse.NewGebaeude(G.GebaeudeID, G.Spieler, G.KP, G.Besetzung, X1, Y1 + 1, G.Feuerbereit)
                            ElseIf G.GetRealGebaeudeID = "OMEGARAKETE" Then
                                Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 1, I).Gebaeude = ObjektLadeklasse.NewGebaeude(G.GebaeudeID, G.Spieler, G.KP, G.Besetzung, X1, Y1 + 1, G.Feuerbereit)
                            ElseIf G.GetRealGebaeudeID = "FABRIK" Then
                                Objektverwalter.Spielfeld.Landschaften(X1, Y1 + 2, I).Gebaeude = ObjektLadeklasse.NewGebaeude(G.GebaeudeID, G.Spieler, G.KP, G.Besetzung, X1, Y1 + 2, G.Feuerbereit)
                            Else
                                Objektverwalter.Spielfeld.Landschaften(X1, Y1, I).Gebaeude = ObjektLadeklasse.NewGebaeude(G.GebaeudeID, G.Spieler, G.KP, G.Besetzung, X1, Y1, G.Feuerbereit)
                            End If
                        End If
                    End If
                Next
            Next
        Next
        UebergaengeAktualiesieren()
    End Sub
    Public Shared Sub CloneUnit(ByVal X As Integer, ByVal Y As Integer, ByVal X1 As Integer, ByVal Y1 As Integer, ByVal I As Integer)
        If Objektverwalter.Spielfeld IsNot Nothing Then
            Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
            If Not E Is Nothing Then
                E.Battlemap = I
                Dim Ladungen(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Ladung.Length - 1) As ObjektEinheit
                For I3 = 0 To Objektverwalter.Spielfeld.Einheiten(X, Y, I).Ladung.Length - 1
                    Dim E2 As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I).Ladung(I3)
                    If Not E2 Is Nothing Then
                        Ladungen(I3) = ObjektLadeklasse.NewEinheit(E2.EinheitenID, E2.Leben, E2.Treibstoff, E2.Munition, E2.Spieler, E2.Besetzen, X, Y, E2.GetTarnung, E2.HatsichBewegt)
                        For I4 = 0 To E2.Ladung.Length - 1
                            Dim E3 As ObjektEinheit = E2.Ladung(I4)
                            If Not E3 Is Nothing Then
                                Ladungen(I3).Ladung(I4) = ObjektLadeklasse.NewEinheit(E3.EinheitenID, E3.Leben, E3.Treibstoff, E3.Munition, E3.Spieler, E3.Besetzen, X, Y, E3.GetTarnung, E3.HatsichBewegt)
                            End If
                        Next
                    End If
                Next
                Objektverwalter.Spielfeld.Einheiten(X1, Y1, I) = ObjektLadeklasse.NewEinheit(E.EinheitenID, E.Leben, E.Treibstoff, E.Munition, E.Spieler, E.Besetzen, X1, Y1, E.GetTarnung, E.HatsichBewegt)
                Objektverwalter.Spielfeld.Einheiten(X1, Y1, I).AIUse = E.AIUse
                Objektverwalter.Spielfeld.Einheiten(X1, Y1, I).TruppenStufe = E.TruppenStufe
                Objektverwalter.Spielfeld.Einheiten(X, Y, I).RestoreUnit(E)
                Objektverwalter.Spielfeld.Einheiten(X, Y, I).Ladung = Ladungen
            Else
                Objektverwalter.Spielfeld.Einheiten(X1, Y1, I) = Nothing
            End If
        End If
    End Sub
#End Region
    ''' <summary>
    ''' The Gamefield used to be saved.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared AutosaveGame As ObjektSpielfeld
    Public Shared CurrentAutosaveGameNumber As Integer = 0
    Public Shared Autosaver As Threading.Thread
    Public Shared Sub Autospeichern()
        While AutosaveGame IsNot Nothing
            Threading.Thread.Sleep(ThreadSleepTime)
        End While
        AutosaveGame = Spielfeld.Clone
        If AutosaveGame.CurrentAI IsNot Nothing Then
            If AutosaveGame.CurrentAI.KIThreat IsNot Nothing Then
                AutosaveGame.CurrentAI.KIThreat.Abort()
            End If
            AutosaveGame.CurrentAI.KIThreat = Nothing
            AutosaveGame.CurrentAI = Nothing
        End If
        If Autosaver IsNot Nothing Then
            While Autosaver.ThreadState = Threading.ThreadState.Running
                Threading.Thread.Sleep(ThreadSleepTime)
            End While
        End If
        Autosaver = New Threading.Thread(AddressOf Autosave)
        Autosaver.Name = "Autosave"
        Autosaver.Start()
    End Sub
    Private Shared Sub Autosave()
        Dim Number As Integer = CurrentAutosaveGameNumber
        CurrentAutosaveGameNumber += 1
        If CurrentAutosaveGameNumber > DataSettings.MaxAutoSpeichern Then
            CurrentAutosaveGameNumber = 0
        End If
        Dim S As ObjektSpielfeld = AutosaveGame
        AutosaveGame = Nothing
        If DataSettings.Autospeichern Then
            If Not Hauptmenue.Connection.Connected Then
                If Not Hauptmenue.AufzeichnungAbspielen Then
                    'If Objektverwalter.Spielfeld.EingabenErlauben Then
                    If Not AlreadySaved Then
                        If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Savegames\Autospeichern" + Number.ToString + ".sav") Then
                            My.Computer.FileSystem.DeleteFile(DataSettings.Resourcenpfad + "Savegames\Autospeichern" + Number.ToString + ".sav")
                        End If
                        Hauptmenue.Speichern(DataSettings.Resourcenpfad + "Savegames\Autospeichern" + Number.ToString + ".sav", ".sav", S)
                    Else 'Gleicher Spielstand.
                    End If
                    'End If
                End If
            End If
            'End If
        End If
    End Sub
    Public Shared Sub AutospeichernLaden()
        If Autosaver IsNot Nothing Then
            While Autosaver.ThreadState = Threading.ThreadState.Running
                Threading.Thread.Sleep(ThreadSleepTime)
            End While
        End If
        If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Savegames\Autospeichern" + (CurrentAutosaveGameNumber - 1).ToString + ".sav") Then
            'Bevor wir einen Stand laden, speichern wir unseren jetztigen lieber nochmal ab...
            Hauptmenue.Speichern("AutospeichernSicherheit", ".sav")

            Hauptmenue.Laden("Autospeichern" + (CurrentAutosaveGameNumber - 1).ToString, False, ".sav", , , True)

            My.Computer.FileSystem.DeleteFile(DataSettings.Resourcenpfad + "Savegames\Autospeichern" + (CurrentAutosaveGameNumber - 1).ToString + ".sav")
            CurrentAutosaveGameNumber -= 1
            If CurrentAutosaveGameNumber < 0 Then
                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Savegames\Autospeichern" + DataSettings.MaxAutoSpeichern.ToString) Then
                    CurrentAutosaveGameNumber = DataSettings.MaxAutoSpeichern
                Else
                    CurrentAutosaveGameNumber = 0
                End If
            End If
        Else
            CurrentAutosaveGameNumber = 0
        End If
    End Sub
End Class
